我有一张桌子:
消息
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>
有人可以帮我吗?
答案 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
列合并到一个变量中,然后您可以从中SELECT
和ORDER BY send_date
。