首页 > 解决方案 > 如何按优先级和日期排序?

问题描述

我有以下 PostgreSQL 查询。

SELECT id FROM table WHERE user_id=$user_id ORDER BY
    CASE
      WHEN (date_completed_utc='0000-00-00 00:00:00') THEN 0 ELSE 1 END ASC

以下是表中内容的示例:

在此处输入图像描述

date_requested_utc始终是过去的日期。

date_completed_utc默认为 '0000-00-00 00:00:00',但后来更改为比date_requested_utc更新的日期。

我想要完成的是:

如果date_completed_utc是默认值,那么所有这些行都将高于一切,但这些行按date_requested_utc降序排序。

但如果date_completed_utc不是默认值,则将这些行放在底部,并按date_completed_utc降序排列这些行。

按 ID 生成的订单应如下所示:

26, 20, 18, 17, 15, 16, 27, 28

我已经尝试了所有这些不同的 CASE 语句,但似乎无法做到正确。

标签: phpsqlpostgresql

解决方案


您可以尝试使用双重订单。

SELECT id 
FROM table 
WHERE user_id=$user_id 
ORDER BY
    CASE WHEN (date_completed_utc='0000-00-00 00:00:00') THEN 0 ELSE 1 END,
    date_requested_utc DESC

编辑

我看到了你的编辑问题。

您不必使用UNION ALL组合两个查询,您可以CASE WHEN直接用表达式查询一个。

Order by号码

  1. 1/(EXTRACT(epoch from age(now(),date_requested_utc)) / 86400 date_requested_utc时间越近,数字就会越大。
  2. 1/(EXTRACT(epoch from age(now(),date_completed_utc::timestamp)) / 86400)::numeric date_completed_utc时间越近,数字就会越大。

你可以试试这个。

SELECT id
SELECT id FROM table 
WHERE user_id=$user_id 
ORDER BY
    (
      CASE WHEN (date_completed_utc='0000-00-00 00:00:00') 
        THEN (EXTRACT(epoch from age(now(),'1970-01-01')) / 86400) + 1/(EXTRACT(epoch from age(now(),date_requested_utc)) / 86400)::numeric
        ELSE  1/(EXTRACT(epoch from age(now(),date_completed_utc::timestamp)) / 86400)::numeric
      END
    )::numeric 
    DESC

sqlfiddle:http ://sqlfiddle.com/#!17/f5f88a/28


推荐阅读