У меня есть comments
таблица, которая может быть упрощена до этого:
comments
=======
id
user_id
text
parent_id
где parent_id
обнуляется, но может быть ключом для родительского комментария.
Теперь, как я могу select
все потомки конкретного комментария?
Комментарии могут быть на несколько уровней ниже ...
источник
Этот дизайн таблицы представляет собой антипаттерн SQL «Наивные деревья», описанный Биллом Карвином (начиная со слайда 48 в своей презентации « Ответный удар антипаттернов SQL» ). Проблема с этим дизайном, в частности, заключается в трудности получения всех потомков (или родителей) узла. Поскольку вы используете MySQL, вы не можете использовать общие табличные выражения (оператор WITH и его модификатор RECURSIVE), присутствующие в других RDBMS.
То, что вы остались с:
строить запросы на самостоятельное объединение с ограничением по глубине. Для глубины = 5 вы можете использовать что-то в строках:
использовать СУБД, которая поддерживает WITH RECURSIVE (хотя, скорее всего, это не вариант для большинства людей)
источник
MySQL не поддерживает рекурсивные запросы, такие как тот, который вам нужен.
Некоторое время назад я написал «Хранимые процедуры», которые обеспечивают модель для этого.
Вместо того, чтобы изобретать велосипед, я дам вам ссылки на мои прошлые сообщения на эту тему:
Oct 24, 2011
: Найти самый высокий уровень иерархического поля: с против без CTEDec 10, 2012
: MySQL: Tree-Hierarchical запросApr 12, 2013
: Рекурсивный запрос в MySQLКороче говоря, хранимые процедуры, которые я сделал, выполняют предварительный порядок обхода дерева с использованием обработки очереди.
GetParentIDByID
GetAncestry
GetFamilyTree
Родитель всем детям (например, хранимая процедура GetFamilyTree)
parent_id
очередиparent_id
как текущийid
значения, которые имеют текущийparent_id
STEP02
Родитель для всех родителей (как хранимая процедура GetAncestry)
id
очередиid
как текущийparent_id
значение текущегоid
STEP02
Пожалуйста, просмотрите Хранимые процедуры в моих других постах, чтобы увидеть реализацию.
Попробуйте!
источник
играть на скрипке
источник