admin

SQL SELECT ORDER BY多列,取决于其他列的值

sql

我有一个包含以下各列的表:

id | 重新访问(布尔)| FL(十进制)| FR(十进制)| RL(十进制)| RR(十进制)| 日期

我需要编写一个SELECT语句,该语句将对多列进行ORDER BY,具体取决于“ revisit”字段的值。

  1. ORDER BY’revisit’DESC-该字段的值为1的记录将是第一个,而其后的值为0
  2. 如果’revisit’= 1,则按FL,FR,RL和RR中存在的最小值排序。因此,如果记录1在这些字段中的值分别为4.6、4.6、3.0、5.0,而记录2的值分别为4.0、3.1、3.9和2.8,则记录2将首先返回,因为它在这四列中均具有最小值。
  3. 如果’revisit’= 0,则按日期排序-最旧的日期为第一个。

到目前为止,我只对“ revisit”进行了正确排序,如果“ revisit” = 0,则按日期排序,但是当“ revisit” =
1时,同时按四列进行排序。

SELECT *
FROM vehicle
ORDER BY
`revisit` DESC,
CASE WHEN `revisit` = 1 THEN `FL` + `FR` + `RR` + `RL` END ASC,
CASE WHEN `revisit` = 0 THEN `date` END ASC

相反,它似乎是按四列的总和排序(在给定加号的情况下这是有意义的),因此,我如何同时按这些列(而不是总和)来对这些列进行排序。

我希望这是有道理的,谢谢!


阅读 147

收藏
2021-06-07

共1个答案

admin

在当前查询中,按四列之和排序。您可以使用least获取最低值,因此order by子句如下所示:

SELECT *
FROM vehicle
ORDER BY
  `revisit` DESC,
  CASE WHEN `revisit` = 1 THEN LEAST(`FL`, `FR`, `RR`, `RL`) END ASC,
  CASE WHEN `revisit` = 0 THEN `date` END ASC

当然,这将仅按最低值排序。如果两行都共享相同的最小值,则第二低的值不会排序。要做到这一点要困难得多,而且我并没有真正从您的问题中得知您是否需要那个。

2021-06-07