如何按优先级和日期排序?

时间:2018-05-01 05:34:07

标签: php sql postgresql

我有以下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

以下是表格中的内容示例:

enter image description here

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陈述,但似乎无法做到正确。

2 个答案:

答案 0 :(得分:2)

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

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越接近时间就越大。
  3. 你可以试试这个。

    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

答案 1 :(得分:0)

(代表作者提问回答)

我将查询更改为以下内容,现在工作正常。

(SELECT id FROM table WHERE user_id=$user_id AND date_completed_utc='0000-00-00 00:00:00' ORDER BY date_requested_utc DESC)
UNION ALL
(SELECT id FROM table WHERE user_id=$user_id AND date_completed_utc!='0000-00-00 00:00:00' ORDER BY date_completed_utc DESC)