按日期列和整数列排序MySQL,但指定整数列的排序规则?

9

I have the following table:

-----------------------------------
  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个回答

7
您可以通过计算表达式来排序查询,例如case:
SELECT   *
FROM     `my_table`
ORDER BY CASE `integer` WHEN 2 THEN 1 ELSE 0 END DESC, `date` ASC

1
+1,第一个使用CASE语句提供有效解决方案的人回复。 - Linger
我最喜欢这个答案,因为它是最灵活的 +1。 - GWed

7
这样做最简单的方法是将您的整数减去2,然后获取该数字的绝对值。然后按照该值进行排序。 2-2的绝对值始终为零,任何其他计算都将大于零。 因此,您将强制将值为2的整数置于列表顶部(SQL Fiddle):
SELECT * FROM myTable
ORDER BY ABS(`integer` - 2), `date`

这个不起作用。日期没有排序。我稍微修改了问题以帮助你理解。 - GWed
@Gaz_Edge,我修改了我的答案,将日期作为次要排序。 - Linger
虽然这是一个聪明的解决方案,适用于小于3的整数,但在此之后它开始变得不稳定:http://sqlfiddle.com/#!2/3988dc/1(我添加了“thesort”以显示发生了什么) - Digital Chris
@Digital Chris,肯定不适用于任何大于3的“整数”。根据Gaz_Edge的示例数据,我选择了这个明确的答案,因为没有大于3的“整数”。如果使用大于3的“整数”,则Mureinik的答案或您的答案将起作用。 - Linger

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


似乎不起作用。日期没有排序。我修改了问题,因为我认为日期让人感到困惑。 - GWed
@Gaz_Edge 有点晚了,但还有另一个可行的解决方案。 - Digital Chris

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上查看结果。

这会输出什么?我不认为整数2会在顶部。 - GWed
@Gaz_Edge . . . 请查看当前版本。之前的版本有一个错误,而当前版本已经经过测试。 - Gordon Linoff
@Gordon Linoff,看了你的SQL Fiddle,当整数不为2时日期没有排序。你把2001年1月5日排在了2001年1月4日之前。 - Linger
@Linger . . . 这是因为1月5日的整数值为“3”。它按整数的最小日期排序。 - Gordon Linoff

2

do it easily by this

EDIT:

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

SECOND_DEMO


不起作用。我稍微修改了问题,因为我认为日期让人感到困惑。 - GWed
@Gaz_Edge 修改了我的答案,请现在尝试一下我的第二次编辑和第二个演示。 - echo_Me
@Gaz_Edge,它在你最后的fiddle中也很好用,链接在这里http://sqlfiddle.com/#!2/3988dc/6。 - echo_Me

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接