Відповіді:
Ієрархічні запити , як відомі ці рекурсивні запити, не підтримуються для MySQL.
Однак вони підтримуються серед Oracle, Microsoft SQL Server, DB2 та PostgreSQL.
Якщо вам потрібно вирішити, ви можете знайти динамічний (і, таким чином, потенційно небезпечний) трюк тут: /programming/8104187/mysql-hierarchical-queries
Ви також можете знайти обговорення питання про те , щоб зберігати ієрархічні дані з іншими моделями , ніж з списком суміжності (тобто батьківського стовпця) тут: /programming/192220/what-is-the-most-efficient- елегантний шлях до розбору-плоскої таблиці-в-дерево /
Удачі!
Цей дизайн таблиці є антипаттерном SQL "Наївні дерева", як описав Білл Карвін (дивлячись зі слайда 48 у своїй презентації SQL Antipatterns Strike Back ). Проблема з цією конструкцією конкретно полягає у труднощах з отриманням усіх нащадків (або батьків) вузла. Оскільки ви використовуєте MySQL, ви не можете використовувати загальні вирази таблиць (оператор WITH та його RECURSIVE модифікатор), присутні в інших RDBMS.
Що вам залишається:
будувати запити самооб’єднання з обмеженням глибини. Для глибини = 5 ви можете використовувати щось у рядках:
SELECT *
FROM comments AS c1
JOIN comments AS c2 ON (c2.parent_id = c1.id)
JOIN comments AS c3 ON (c3.parent_id = c2.id)
JOIN comments AS c4 ON (c4.parent_id = c3.id)
JOIN comments AS c5 ON (c5.parent_id = c4.id)
використовувати RDBMS, який підтримує функцію RECURSIVE (хоча це, швидше за все, не є варіантом для більшості людей)
MySQL не підтримує рекурсивні запити, такі як потрібний вам.
Те, що я робив деякий час назад, - це писати «Збережені процедури», які забезпечують модель для цього.
Замість того, щоб винаходити колесо, я дам вам посилання на мої минулі публікації з цього приводу:
Oct 24, 2011
: Знайдіть найвищий рівень ієрархічного поля: з vs без CTEDec 10, 2012
: MySQL: Дерево-Ієрархічний запитApr 12, 2013
: Рекурсивний запит у mysqlКоротше кажучи, збережені мною процедури, які я зробив, роблять попередній обхід дерева за допомогою обробки черги
GetParentIDByID
GetAncestry
GetFamilyTree
parent_id
чергиparent_id
як поточнийid
значення, які мають струмparent_id
STEP02
id
чергиid
як поточнийparent_id
значення струмуid
STEP02
Перегляньте Збережені процедури в інших моїх публікаціях, щоб побачити реалізацію.
SELECT group_concat(@id :=
(
SELECT id
FROM comments
WHERE parent_id = @id
)) AS comment
FROM (
SELECT @id := 1
) vars
STRAIGHT_JOIN
comments
WHERE @id IS NOT NULL