Сортировка связанного списка в Mysql - PullRequest
0 голосов
/ 25 мая 2018

У меня есть следующая таблица в MySQL

id  previous
1   null
2   1
3   2
4   3

Я хотел бы отсортировать это в mysql -> так, чтобы в этом случае он возвращал 1,2,3,4.Как это сделать?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

В версиях 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 и ниже.

0 голосов
/ 25 мая 2018

В MySQL 8.0:

with recursive my_node (id) as (
    select id from table_a where parent_id is null
    union all
    select a.id from my_node n join table_a a on n.id = a.parent_id
  )
select * from my_node;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...