按顺序排列两个条件

时间:2014-10-16 13:30:06

标签: mysql sql

我尝试实现以下目标:我有不同颜色的消息(redorangegreen)。现在,我希望通过以下条件对我们过去三次发布的消息中的结果集进行排序:

  • 如果最新消息为绿色,则应位于顶部
  • 任何其他消息都应按以下顺序排序: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

2 个答案:

答案 0 :(得分:3)

在第一次猜测时,您可以通过

尝试类似条件订单的操作

QUERY:

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;