MySQL: id в обратном порядке, сохраняя порядок значений других столбцов
Мое решение - использовать дополнительный счетчик строк для того, чтобы иметь идентификатор строк, по которому можно соединить результаты двух подзапросов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SELECT id, color FROM ( SELECT id, @join_pk_1:=@join_pk_1 + 1 as join_pk FROM tmp, (select @join_pk_1:=0) as join_pk_1 ORDER BY id DESC ) as tbl1 LEFT JOIN ( SELECT color, @join_pk_2:=@join_pk_2 + 1 as join_pk FROM tmp, (select @join_pk_2:=0) as join_pk_2 ) as tbl2 ON tbl1.join_pk = tbl2.join_pk |
Думаю, это отличная задача для проверки знаний MySQL во время собеседования, кроме того тут есть прямо ооочень много моментов про которые можно поговорить далее: стоит ли так вообще делать, особенно в случае если id это Primary Key; работа JOIN-ов, подзапросы; переменные внутри запросов. В общем, лично мне, вопрос очень понравился.
--[добавлено 08.10.18]--
Вернувшись к этому вопросу позже, заметил одну проблему, из-за сортировки по id, запрос неккоректно отработает на наборе данных где id идут не в порядке увеличения, пример
1 2 3 4 5 6 7 8 9 10 |
INSERT INTO tmp (id, color) VALUES (1, 'green'), (21, 'red'), (3, 'blue'), (4, 'white') ; |
текущее решение выведет такой результат
1 2 3 4 5 6 7 8 |
id color --------------- 21 green 4 red 3 blue 1 white |
вместо ожидаемого
1 2 3 4 5 6 7 8 |
id color --------------- 4 green 3 red 21 blue 1 white |
Для решения это проблемы, надо сортировку ORDER BY id DESC заменить на DESC сортировку по номеру строки, тогда запрос будет работать на любом наборе данных.
Author: | Tags: /
| Rating:
Leave a Reply