MySQL Order By date列和整数列,但是指定整数列的排序规则?

时间:2014-02-10 19:19:24

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

我有下表:

-----------------------------------
  PK       integer          date
-----------------------------------
  1          2             03/01/01
  2          1             04/01/01
  3          3             02/01/01
  4          3             05/01/01
  5          2             01/01/01
  6          1             06/01/01

我想要做的是按日期列进行排序,但是要使整数2的日期高于其他整数的顺序。我的输出就是这样。

-----------------------------------
  PK       integer          date
-----------------------------------
  1          2             01/01/01
  5          2             03/01/01      
  3          3             02/01/01
  2          1             04/01/01
  4          3             05/01/01
  6          1             06/01/01

目前,我完全不知道如何在MySQL中实现这一点,或者即使它可能。我还没有尝试任何东西,因为我不知道从哪里开始。

我应该说非2的整数顺序不是问题,所以下表同样好。

-----------------------------------
  PK       integer          date
-----------------------------------
  1          2             01/01/01
  5          2             03/01/01      
  2          1             04/01/01
  6          1             06/01/01
  3          3             02/01/01
  4          3             05/01/01

5 个答案:

答案 0 :(得分:7)

您可以按计算的表达式排序查询,例如case

SELECT   *
FROM     `my_table`
ORDER BY CASE `integer` WHEN 2 THEN 1 ELSE 0 END DESC, `date` ASC

答案 1 :(得分:7)

最简单的方法是将integer减去2,然后获取该数字的绝对值。然后对此进行排序。 2 - 2的绝对值将始终为零,任何其他计算将大于零。因此,您将强制integer的2位于列表顶部(SQL Fiddle):

SELECT * FROM myTable
ORDER BY ABS(`integer` - 2), `date`

答案 2 :(得分:4)

使用UNION执行此操作比我初想的要复杂,但您可以指定优先级:

SELECT 1 as priority, id, mynumber, date from myTable
WHERE mynumber = 2

UNION

SELECT 2, id, mynumber, date from myTable
WHERE mynumber <> 2

ORDER BY priority ASC, date ASC

http://sqlfiddle.com/#!2/570be/16

答案 3 :(得分:2)

如果我正确理解了问题,您希望按最小日期排列整数。

您需要计算此字段,将其加入,然后将其用于排序:

select t.*
from t join
     (select `integer`, min(date) as mindate
      from t
      group by `integer`
     ) tm
     on tm.`integer` = t.`integer`
order by tm.mindate, integer;

您可以在SQL Fiddle上看到结果。

答案 4 :(得分:2)

通过此

轻松完成

编辑:

   select * from Table1
   order by case when `integer` != 2 then `date` end asc ,
            case when `integer` = 2 then `date` end asc ;

SECOND_DEMO