分组与“desc”不兼容加入

时间:2016-01-26 01:13:51

标签: mysql join group-by

我有这张桌子“聊天”

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”部分,它在加入之前有效,但之后没有。我的查询出了什么问题?

3 个答案:

答案 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

如果您有其他要求,可能会完全改变

这是sqlfiddle

答案 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)

SQL让我害怕,你太懒了! 如果我是你,我会乖乖地以这种方式写sql:

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

我不认为后者是明确的。