我尝试实现以下目标:我有不同颜色的消息(red
,orange
,green
)。现在,我希望通过以下条件对我们过去三次发布的消息中的结果集进行排序:
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
答案 0 :(得分:3)
在第一次猜测时,您可以通过
尝试类似条件订单的操作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 |
+----+--------+
答案 1 :(得分:0)
使用John Ruddell的回答,我最后一次使用查询,然后在order by子句中使用它。
SET @const = 3;
SET @last_time = (SELECT status_date FROM mod_metanet_cc_stream_entry WHERE DATE_ADD(status_date, INTERVAL @const HOUR) >= NOW() ORDER BY status_date DESC LIMIT 1);
SELECT ID, color, status_date
FROM mod_metanet_cc_stream_entry
WHERE DATE_ADD(status_date, INTERVAL @const HOUR) >= NOW()
ORDER BY
CASE
WHEN (status_date = @last_time AND color = 'green') THEN 1
WHEN color = 'red' THEN 2
WHEN color = 'orange' THEN 3
ELSE 4
END;