【问题标题】:MYSQL ORDER BY clause is not workingMYSQL ORDER BY 子句不起作用
【发布时间】:2017-12-14 10:22:33
【问题描述】:

我有餐桌任务:

id      title   date_task               complete

4948    Test 1  2017-11-10T11:00:00Z    1
4953    Test 2  2017-11-13T14:00:00Z    1
5028    Test 3  2017-11-21T11:00:00Z    1
5029    Test 4  2018-04-02T10:00:00Z    0

我想先排序:如果 tasks.comeplete = 0 按 ASC 排序,其他按 desc 排序...

我的查询:

SELECT 
    *
FROM 
    `tasks`
ORDER BY 
    CASE WHEN tasks.complete = 0 THEN tasks.date_task END ASC, tasks.date_task DESC

我的结果:

id      title   date_task               complete
5028    Test 3  2017-11-21T11:00:00Z    1
4953    Test 2  2017-11-13T14:00:00Z    1
4948    Test 1  2017-11-10T11:00:00Z    1
5029    Test 4  2018-04-02T10:00:00Z    0

我想要结果:

id  title   date_task   complete
5029    Test 4  2018-04-02T10:00:00Z    0
5028    Test 3  2017-11-21T11:00:00Z    1
4953    Test 2  2017-11-13T14:00:00Z    1
4948    Test 1  2017-11-10T11:00:00Z    1

SQL FIDDLE:http://sqlfiddle.com/#!9/6f4a0/1

谢谢

【问题讨论】:

  • 你的意思是,如果complete = 0,那么日期应该是升序,如果是1,那么降序对吧?
  • 是的,因为结果对我来说似乎很好,因为 2018-04-02T10:00:00Z 年份是 2018
  • 不,只有在完成 = 0 时才排序,其次是其他人

标签: php mysql sql sorting sql-order-by


【解决方案1】:

这是一种方法:

SELECT *
FROM `tasks`
ORDER BY tasks.complete,
         CASE 
            WHEN tasks.complete = 0 THEN DATEDIFF(tasks.date_task, '1900-01-01') 
            ELSE DATEDIFF('1900-01-01', tasks.date_task) 
         END

Demo here

【讨论】:

  • 谢谢!但是这个查询很长...... :)
【解决方案2】:

这很简单:

SELECT *
FROM tasks
ORDER BY
    tasks.complete,
    CASE WHEN tasks.complete = 0 THEN tasks.date_task END,
    CASE WHEN tasks.complete = 1 THEN tasks.date_task END DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2017-12-07
    • 1970-01-01
    相关资源
    最近更新 更多