动态/递归 SQL 排序依据
Posted
技术标签:
【中文标题】动态/递归 SQL 排序依据【英文标题】:Dynamic/Recursive SQL Order By 【发布时间】:2018-10-07 01:35:01 【问题描述】:我正在为正在开发的 wordpress 主题构建队列插件。我正在使用单向链表来完成此操作。每行在数据库中都有一个“previous_item_id”列,指向应该在它之前打印的行!需要一个 ODRDER BY 向导大声笑,谢谢你
当前数据库表:
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
如何编写一个 SQL 语句,使用 Order By 来获取 previous_item_id
的下一行,如下所示:
previous_item_id
(哪个是第一个)
第二个项目的previous_item_id应该是1
第三个项目的前一个 item_id 应该是 2
第四个项目的previous_item_id应该是3
您基本上将previous_item_id
设为NULL 的初始行,然后通过ID 递归地获取下一行。
order by 的输出应该打印: 应该打印什么:
test@gmail.com
test2@gmail.com
test4@gmail.com
test3@gmail.com
test5@gmail.com
【问题讨论】:
标签sql server
与wordpress 插件有什么关系? (仅使用与您的问题直接相关的标签)
你的描述和你的结果不匹配。
怎么样?它从 null 行开始,然后需要返回第一行 previous_item_id 的行
你的意思是你想按以前的id订购?
这个问题不合逻辑。 @Gordon Linoff 是正确的。考虑您的第四个项目,即带有 EMAIL 'test3@gmail.com' 的项目,如您的描述所述,它的 PREVIOUS_ITEM_ID = 4 而不是 3。任意链表的键不会按升序排列。
【参考方案1】:
这是无法做到的。底层数据结构是一个任意的链表。 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
在任意链表中,键不一定是连续升序的。
【讨论】:
【参考方案2】:您可以使用相关子查询来获取上一个项目 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;
【讨论】:
这适用于 1 个表还是 2 个表?抱歉,我不太清楚如何将其应用于上述情况 @rwchampin 。 . .这适用于一张桌子。t
是表名。
非常感谢,那么 t2 呢?
@rwchampin 。 . .这是对您的表的第二次引用的表别名。【参考方案3】:
使用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
【讨论】:
抱歉,这将如何通过previous_item_id
值抓取下一行?
你要一个订单,我提供一个。【参考方案4】:
SELECT yourtable.email
FROM yourtable
ORDER BY previous_item_id
幸运的是,您不需要递归,因为所有记录都是相关的。如果还有其他键,只需将它们添加到 where。
【讨论】:
以上是关于动态/递归 SQL 排序依据的主要内容,如果未能解决你的问题,请参考以下文章