SQL SELECT ORDER BY多列,具体取决于其他列

时间:2015-05-06 12:08:35

标签: mysql sql sql-order-by

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

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

我需要编写一个SELECT语句,它将在多个列上进行ORDER BY,具体取决于'revisit'字段的值。

  1. ORDER BY'重新访问'DESC - 此字段的值为1的记录将是第一个,0将在之后
  2. 如果'重访'= 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则按日期排序 - 最早的日期将是第一个。
  4. 到目前为止,我已经正确地单独排序了'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
    

    相反,似乎是按照四列的总数排序(这对于添加符号是有意义的),所以我如何同时将这些列作为单独的列进行排序,而不是求和。

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

1 个答案:

答案 0 :(得分:2)

在当前查询中,您按四列的总和进行排序。您可以使用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

当然,这只会按最低值排序。如果两行都共享相同的最低值,则对第二低的值没有排序。要做到这一点要困难得多,而且我是否真的从你的问题中得到你是否需要它。

相关问题