我有这张桌子“聊天”
id | id_user_1 | id_user_2
----------------------------
1 111 117
2 113 115
3 112 111
和这一个,“消息”:
id | message | message_date | id_sender | id_chat
-------------------------------------------------
1 first xx/xx/xx 111 1
2 second xx/xx/xx 117 1
3 abc xx/xx/xx 113 2
4 first xx/xx/xx 112 3
5 second xx/xx/xx 111 3
我需要列出每个用户的最后一条消息,我知道还有其他这样的问题,但我找不到我在这里做错了什么;这是我的问题:(问题是我得到第一条消息,而不是每个用户的最后一条消息)
select t1.id, t2.message, t2.message_date
from chat as t1
join chat_messages as t2
where
(t1.id_user_1 = 111 or t1.id_user_2 = 111)
and
(t1.id = t2.id_chat)
group by t2.id_chat desc
此回报:
id | message | message_date |
------------------------------
3 first xx/xx/xx
1 first xx/xx/xx
应该是:
id | message | message_date |
------------------------------
3 second xx/xx/xx
1 second xx/xx/xx
一切看起来都不错,除了“desc”部分,它在加入之前有效,但之后没有。我的查询出了什么问题?
答案 0 :(得分:0)
不是最好的解决方案,但你可以尝试这样简单的事情:
select * from (select t1.id, t2.message, t2.message_date
from chat as t1
join messages as t2 on t1.id=t2.id_chat
where
(t1.id_user_1 = 111 or t1.id_user_2 = 111)
and
(t1.id = t2.id_chat)
order by message desc) a
group by id
如果您有其他要求,可能会完全改变
答案 1 :(得分:0)
您可以尝试将消息表加入自己,并使用相同的聊天ID和更大的消息ID。
SELECT c.id, m1.message, m1.message_date
FROM chat c
LEFT JOIN messages m1 ON m1.id_chat = c.id
LEFT JOIN messages m2 ON m2.id_chat = m1.id_chat AND m2.id > m1.id
WHERE m2.id IS NULL;
这将产生一个结果,其中有NULL
m2.id记录。此记录将指示这是最后一条消息。所以我们现在可以使用WHERE条件
答案 2 :(得分:0)
select * from A a join B b on a.id=b.id group by a.message order by b.message desc
而不是:
select * from A a join B b where a.id=b.id group by a.message desc
我不认为后者是明确的。