php - 如何按优先级和日期排序?
问题描述
我有以下 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 语句,但似乎无法做到正确。
解决方案
您可以尝试使用双重订单。
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/(EXTRACT(epoch from age(now(),date_requested_utc)) / 86400
date_requested_utc
时间越近,数字就会越大。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
推荐阅读
- c# - 使用谷歌地图时 C# 版本的网络浏览器警告 - Windows 7 和 Internet Explorer 8
- openlayers - OpenLayers 4.x 风格的多边形取决于它上面的特征数量..?
- javascript - vue 路由器参数改变数据
- javascript - 将鼠标悬停在所有列表项上,指定的除外
- soap - JAX WS 生成的客户端从新的 Axis2 版本中获取“无法确定 SOAP 版本”
- java - 由点分隔的两部分字符串的正则表达式
- yii - UploadedFile::getInstances 在 yii2 中给出空数组并且文件上传不起作用
- jquery - 在不接触 html 的情况下将链接放在 div 上
- javascript - 如何使用 node js 将 Base64 转换为 HTML
- excel - 过滤每个值,将每个表复制并粘贴到新工作表中