动态/递归sql order by

q8l4jmvw  于 2021-06-18  发布在  Mysql
关注(0)|答案(4)|浏览(310)

我正在为我正在处理的wordpress主题构建一个队列插件。我使用一个单向链表来完成这个任务。每行在数据库中都有一个“previous\u item\u id”列,它指向应该在它前面打印的行!需要巫师的命令,哈哈,谢谢
当前数据库表:

ID     EMAIL           PREVIOUS_ITEM_ID
1      test@gmail.com     NULL
2      test2@gmail.com    1
3      test3@gmail.com    4
4      test4@gmail.com    2
5      test5@gmail.com    3

如何编写使用orderby来获取下一行的sql语句 previous_item_id 这样地:
第一项应该没有 previous_item_id (这是第一个)
第二个项应该有1作为上一个\u项\u id
第三项应该有2作为上一项的id
第四项应该有3作为上一个\u项\u id
你基本上把空的第一行作为 previous_item_id 然后根据id递归地获取下一行。
order by的输出应打印:应打印的内容:

test@gmail.com
test2@gmail.com
test4@gmail.com
test3@gmail.com
test5@gmail.com
prdp8dxp

prdp8dxp1#

SELECT yourtable.email
FROM yourtable
ORDER BY previous_item_id

幸运的是,您不需要递归,因为所有记录都是相关的。如果有其他键,只需将它们添加到where。

sauutmhj

sauutmhj2#

可以使用相关子查询获取上一个项id:

select t.*,
       (select t2.id
        from t t2
        where t2.id < t.id
        order by t2.id desc
        limit 1
       ) as prev_id
from t;
2jcobegt

2jcobegt3#

使用 case expression 例如:

order by case when PREVIOUS_ITEM_ID IS NULL then 0 else PREVIOUS_ITEM_ID end

MAIL               
test@gmail.com 
test2@gmail.com 
test4@gmail.com 
test5@gmail.com 
test3@gmail.com
ftf50wuq

ftf50wuq4#

这是做不到的。底层数据结构是一个任意链表。order by需要一个表达式来对数据结构中的项进行排序。在任意链表中,此表达式不存在。
请注意,部分问题在逻辑上不正确。

the first item should have no previous_item_id(Which makes it first)
the second item should have 1 as the previous_item_id
the third item should have 2 as the previous item_id
the fourth item should have 3 as the previous_item_id

在任意链表中,键不一定是连续的升序。

相关问题