Получение всех родительских строк в одном SQL-запросе

У меня есть простая таблица MySQL, которая это, содержит список категорий, уровень определяется parent_id:

id  name    parent_id
---------------------------
1   Home        0
2   About       1
3   Contact     1
4   Legal       2
5   Privacy     4
6   Products    1
7   Support     1

Я пытаюсь сделать пройденный путь. Таким образом, у меня есть 'идентификатор' ребенка, я хочу получить всех доступных родителей (выполняющий итерации цепочки, пока мы не достигаем 0 "Домашних"). Могло быть любое число или дочерние строки, идущие в неограниченную глубину.

В настоящее время я использую призыв SQL к каждому родителю, это грязно. Существует ли путь в SQL, чтобы сделать это все на одном запросе?

24
задан Bill Karwin 16 April 2018 в 06:53
поделиться

3 ответа

Адаптировано из здесь:

SELECT T2.id, T2.name
FROM (
    SELECT
        @r AS _id,
        (SELECT @r := parent_id FROM table1 WHERE id = _id) AS parent_id,
        @l := @l + 1 AS lvl
    FROM
        (SELECT @r := 5, @l := 0) vars,
        table1 h
    WHERE @r <> 0) T1
JOIN table1 T2
ON T1._id = T2.id
ORDER BY T1.lvl DESC

Строка @r := 5 - это номер текущей страницы. Результат выглядит так:

1, 'Home'
2, 'About'
4, 'Legal'
5, 'Privacy'
59
ответ дан 28 November 2019 в 22:43
поделиться

Я думаю, что нет простого способа сделать это, используя один запрос.

Я бы порекомендовал взглянуть на Вложенные наборы , которые, кажется, соответствуют вашим потребностям.

0
ответ дан 28 November 2019 в 22:43
поделиться

AFAIK нет.

Эта статья о Sitepoint может вам помочь.

Вы можете получить все элементы с помощью одного запроса, сохранить их в массиве, а затем выполнить итерацию , как описано здесь и здесь

-1
ответ дан 28 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: