【问题标题】:Dynamic/Recursive SQL Order By动态/递归 SQL 排序依据
【发布时间】: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。任意链表的键不会按升序排列。

标签: php mysql sql wordpress


【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      相关资源
      最近更新 更多