@alexDee

Объединение результата подзапроса с основным запросом в MySQL

Добрый день. Помогите, пожалуйста, с вопросом. Есть что-то похожее на рекурсивный запрос:

SELECT ID_раздела
FROM Разделы
WHERE ID_родительского_раздела IN
    (SELECT ID_раздела FROM Разделы WHERE ID_родительского_раздела=226)

Как в итоге получить результат в одной колонке?

Друзья-товарищи подсказали решение:
SELECT ID_раздела
FROM Разделы
WHERE ID_родительского_раздела=226
UNION
SELECT ID_раздела
FROM Разделы
WHERE ID_родительского_раздела IN
    (SELECT ID_раздела FROM Разделы WHERE ID_родительского_раздела=226)


Но, однако же, я верю, что есть гораздо более лаконичный вариант решения этого, как оказалось, непростого для меня вопроса. За этим и обращаюсь к вам. Заранее спасибо!
  • Вопрос задан
  • 3120 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT t1.ID_раздела FROM Разделы AS t1 
    LEFT JOIN Разделы AS t2 ON t1.ID_родительского_раздела = t2.ID_раздела 
    WHERE t1.ID_родительского_раздела = 266 OR t2.ID_родительского_раздела = 266
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
egor_nullptr
@egor_nullptr
SELECT ID_раздела
FROM Разделы
WHERE ID_родительского_раздела IN
    (SELECT ID_раздела FROM Разделы WHERE ID_родительского_раздела=226)
    OR
    ID_родительского_раздела=226
Ответ написан
MySQL не самое изящное хранилище для иерархий, потому как не поддерживает иерархические запросы (конструкция CONNECT BY). Поэтому книжное решение вам не подойдет, придется искать обходы, а здесь все зависит от контекста:
1. самое простое: если разделов не много, то прочитать всю таблицу, и работать с данными вне БД;
2. если очень хочется использовать БД, нужно использовать избыточное представление: Раздел_1_ID, Раздел_2_ID, Уровень_Вложенности. В таком виде таблица описывает вложенности между всеми элементами. Для этого может подойти либо хранимая процедура, либо представление.

P.S. Если у вас только два уровня вложенности (или нужны только два уровня), то решение друзей-товарищей ничем не хуже, да и проще всего, что я тут описал =)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы