【发布时间】:2017-01-12 05:23:11
【问题描述】:
SQL 小提琴:http://sqlfiddle.com/#!15/1da00/5
我有一个看起来像这样的表:
products
+-----------+-------+--------------+--------------+
| name | price | created_date | updated_date |
+-----------+-------+--------------+--------------+
| chair | 50 | 10/12/2016 | 1/4/2017 |
| desk | 100 | 11/4/2016 | 12/27/2016 |
| TV | 500 | 12/1/2016 | 1/2/2017 |
| computer | 1000 | 12/28/2016 | 1/1/2017 |
| microwave | 100 | 1/3/2017 | 1/4/2017 |
| toaster | 20 | 1/9/2017 | 1/9/2017 |
+-----------+-------+--------------+--------------+
我想以这样一种方式订购此表,如果产品创建时间少于 30 天,则应首先显示这些结果(并在更新日期之前订购)。如果产品是在 30 天或更长时间前创建的,我希望它在之后显示(并在该组中按更新日期排序)
结果应该是这样的:
products - desired results
+-----------+-------+--------------+--------------+
| name | price | created_date | updated_date |
+-----------+-------+--------------+--------------+
| toaster | 20 | 1/9/2017 | 1/9/2017 |
| microwave | 100 | 1/3/2017 | 1/4/2017 |
| computer | 1000 | 12/28/2016 | 1/1/2017 |
| chair | 50 | 10/12/2016 | 1/4/2017 |
| TV | 500 | 12/1/2016 | 1/2/2017 |
| desk | 100 | 11/4/2016 | 12/27/2016 |
+-----------+-------+--------------+--------------+
我已经开始写这个查询了:
SELECT *,
CASE
WHEN created_date > NOW() - INTERVAL '30 days' THEN 0
ELSE 1
END AS order_index
FROM products
ORDER BY order_index, created_date DESC
但这只会将带有created_date 的行少于 30 天带到顶部,然后由created_date 排序。我还想按updated_date 对order_index = 1 的行进行排序
【问题讨论】: