联合中的订单列由另一列选择

时间:2018-11-23 13:21:14

标签: mysql sql sql-order-by union

我有一张桌子:

消息

id, user_from_id, user_to_id, send_date, message, is_readed

,我想选择所有与我聊天的用户,所以查询如下:

SELECT user_from_id as user_id
FROM message
WHERE user_to_id=xxx
UNION
SELECT user_to_id
FROM message
WHERE user_from_id=xxx

..并且我有一个user_id的列表,问题是我找不到通过send_data订购这些ID的方法,因此在该列表的开头,我会有一个我最近与之聊天的用户< / p>

有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

放弃union怎么样?

SELECT (CASE WHEN m.user_to_id = xxx THEN m.user_from_id
             ELSE m.user_to_id
        END) as user_id
FROM message m
WHERE xxx IN (m.user_to_id, m.user_from_id)
ORDER BY m.send_date DESC;

这可能不是您真正想要的,因为用户将在列表中出现多次。您真正想要的是:

SELECT (CASE WHEN m.user_to_id = xxx THEN m.user_from_id
             ELSE m.user_to_id
        END) as user_id
FROM message m
WHERE xxx IN (m.user_to_id, m.user_from_id)
GROUP BY m.user_id
ORDER BY MAX(m.send_date) DESC;

答案 1 :(得分:0)

with x as(
SELECT user_from_id as user_id, send_date
FROM message
WHERE user_to_id=xxx
UNION
SELECT user_to_id, send_date
FROM message
WHERE user_from_id=xxx
) select user_id 
from x 
order by send_date

这会将UNION查询和send_date列合并到一个变量中,然后您可以从中SELECTORDER BY send_date