我尝试实现以下目标:我有不同颜色的消息(红色
、橙色
、绿色
)。现在我想根据以下条件从最近三个我们发布的消息中对我的结果集进行排序:
- 如果最新的消息是绿色的则应该在最上面
- 任何其他消息应按以下顺序排序:1.
red
,2. orange
,3. green
这是我目前使用的 SQL。但这不处理最近发布绿色消息的情况:
SELECT ID, color
FROM mod_cc_stream_entry
WHERE DATE_ADD(status_date, INTERVAL 3 HOUR) >= NOW()
ORDER BY FIELD(COALESCE(color, 'green'), 'red', 'orange', 'green')
我可以运行两个语句。首先检查最新消息是否为 green
,如果不是,则运行第二条语句以获得我喜欢的顺序(上面的语句)。
但我想知道是否有可能在一个声明中做到这一点。
更新 SQLFiddle
乍一看,您可以尝试类似条件订单的方式
查询:
SELECT ID, color
FROM mod_metanet_cc_stream_entry
JOIN (
SELECT MAX(status_date) as new_status
FROM mod_metanet_cc_stream_entry
) temp
WHERE DATE_ADD(status_date, INTERVAL 3 HOUR) >= NOW()
ORDER BY
CASE
WHEN status_date = new_status AND color = 'green' THEN 1
WHEN color = 'red' THEN 2
WHEN color = 'orange' THEN 3
WHEN color is null THEN 8
ELSE 4
END
虽然我需要一些数据来测试它
输出:
+----+--------+
| ID | COLOR |
+----+--------+
| 20 | red |
| 26 | red |
| 17 | red |
| 23 | red |
| 16 | orange |
| 24 | orange |
| 21 | orange |
| 27 | orange |
| 18 | green |
| 19 | green |
| 22 | NULL |
| 25 | NULL |
+----+--------+
我是一名优秀的程序员,十分优秀!