动态/递归 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 排序依据的主要内容,如果未能解决你的问题,请参考以下文章

五类常见算法小记 (递归与分治,动态规划,贪心,回溯,分支界限法)

SQL问题 实现递归查询

SQL递归查询所有子节点

ms sql 2005 递归查询如何实现

关于SQL递归查询问题

200分求助!SQL递归查询所有子节点