【问题标题】:MYSQL Specific Order With Conditionals带有条件的 MYSQL 特定顺序
【发布时间】:2020-10-18 23:50:15
【问题描述】:

好的...我想根据他们的条件订购三列。

  • 第 1 列 (INT) = last_reboot
  • 第 2 列 (BOOL) = 在线检查
  • 第 3 列 (INT) = drive_use

我希望“last_reboot”为默认值并按降序排列。如果“onlinecheck”= 0,我希望它位于查询的顶部,否则由“last_reboot” desc 排序。最后,如果“drive_use”大于 90,我希望它在“last_reboot”上方和“onlinecheck”下方排序 = 0,否则按“last_reboot”排序。

示例目标:

| last_reboot | onlinecheck | drive_use |
----------------------------------------------
|      15     |      0      |     80    |
|      90     |      1      |     91    |
|     320     |      1      |     80    |
|      45     |      1      |     50    | 
|      20     |      1      |     89    | 

我可以通过使用 ORDER BY FIELDS 来实现其中的一半,但是一旦我引入了“drive_use”,我就无法让它正常运行。如果它不为空,“drive_use”总是排在“last_reboot”之上。

SELECT * FROM <table> ORDER BY FIELD (onlinecheck, 0) DESC, (drive_per > 90), last_reboot DESC;

非常感谢任何和所有帮助。如果需要进一步解释,请告诉我。

【问题讨论】:

    标签: mysql sql database select sql-order-by


    【解决方案1】:

    我认为你必须与ORDER BY CASEhttps://dev.mysql.com/doc/refman/8.0/en/case.html合作

    我不确定我是否很好地理解了这个案例,但我认为这非常接近:

    ORDER BY (CASE
        WHEN onlinecheck = 0 THEN 2 
        WHEN (drive_use > 90) THEN 1 
        ELSE 0
    END) DESC,
    last_reboot DESC
    

    Here a DB-Fiddle

    【讨论】:

    • 谢谢。这正是我想要的。
    【解决方案2】:

    我想你想要:

    order by 
        onlinecheck,
        drive_use > 90 desc,
        last_reboot desc
    

    这会将带有onlinecheck = 0 的行放在首位。然后,在90 上方有drive_use 的行。在last_reboot 上以降序排列打破平局。

    【讨论】:

    • drive_per 和 last_reboot 的顺序正确,但不管 bool 是 onlinecheck 在查询的底部。
    • @pastyj:这会将具有onlinecheck = 0 的行放在首位。 Here is a db fiddle供您参考。
    • 感谢您抽出宝贵时间提供帮助。此解决方案的唯一问题是“drive_use”是否具有 NULL 值。如果“drive_use”=NULL,它将在“last_reboot”下方查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2014-08-17
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多