我需要在用户之间开发私人消息系统,这就是我想要做的事情:
我有一张如下表格:
id | from_user_id | to_user_id | message
1 | 1 | 2 | Hey n°1 ! <-- Me with user n°2
2 | 2 | 1 | Hey n°2 ! <-- Me with user n°2
4 | 1 | 3 | Hey n°3 ! <-- Me with user n°3
3 | 3 | 2 | Hey n°4 !
我们假设我是用户n°1,我希望获得我的最后一条消息“按用户分组”并按ID排序,作为讨论:
id | with_user_id | message
4 | 3 | Hey n°3 !
2 | 2 | Hey n°2 !
我尝试过像:
这样的请求SELECT id, message,
(CASE WHEN from_user_id = 1 THEN to_user_id ELSE from_user_id END) AS with_user_id
FROM privates
WHERE from_user_id = 1 OR to_user_id = 1
GROUP BY with_user_id
ORDER BY id DESC
但我得到了这个:
id | with_user_id | message
4 | 3 | Hey n°3 !
1 | 2 | Hey n°1 !
所以问题是它选择第一条用户为n°1而不是最后一条消息。
答案 0 :(得分:1)
注意:这在MSSQL中不起作用,因为子查询中不允许使用OrderBy子句。如果您使用的是MSSQL,则可以使用与this问题中的答案类似的方法。
您需要在group by之前应用订单,因为group by语句将消息1和2分组并选择第一个消息。尝试这样的事情:
Select SQ.*
FROM (
SELECT id, message,
(CASE WHEN from_user_id = 1 THEN to_user_id ELSE from_user_id END) AS with_user_id
FROM privates
WHERE from_user_id = 1 OR to_user_id = 1
ORDER BY id DESC
) AS SQ
GROUP BY SQ.with_user_id
以这种方式订购只会获得给定会话的最新消息。
答案 1 :(得分:0)
看起来您需要用户创建对话框的所有消息,请尝试按照选择
select id, from_user_id, to_user_id, message,
from privates
where from_user_id = 1
or to_user_id = 1
order by case
when from_user_id = 1 then
to_user_id
else
from_user_id
end,
id desc