В версиях MySql ниже 8 вы можете использовать переменную, которая изменяется во время выполнения запроса:
select @id := if((select @n := id from tab where coalesce(parentId, -1) = @id), @n, @n)
from tab,
(select @id := -1) init
Обратите внимание, что хотя в основном предложении from
упоминается таблица (которую я назвал tab
) он на самом деле ничего не выбирает из него.Он служит только для того, чтобы получить столько результатов в выводе.Логика находится в подзапросе в предложении select
: каждый раз, когда она выполняет переменную, @n
получает значение next на основе текущего значения @id
.-1 зарезервировано для совпадения с null
.Это значение @n
затем возвращается в @id
, ... и т. Д.
sqlfiddle
Отказ от ответственности : абсолютного нетгарантировать, что порядок выполнения соответствует ожидаемому, или что механизм не будет пытаться кэшировать результат, что приведет к неожиданным результатам.Это всего лишь небрежный обходной путь отсутствия поддержки рекурсивных запросов в MySql 5.7 и ниже.