0
SELECT * FROM conversation_1 
LEFT JOIN conversation_2
ON conversation_1.c_id = conversation_2.c_id

LEFT JOIN user
ON conversation_2.user_id = user.user_id

LEFT JOIN message
ON conversation_1.c_id = message.c_id

WHERE conversation_1.user_id=1
GROUP BY message.c_id


conversation_1      conversation_2
c_id    user_id     c_id    user_id
1       1           1       2
2       1           2       3
3       2

我在 Mysql 中有一条消息 DB 构建

我做了 4 个表用户,conversation_1,conversation_2,message

当用户尝试打开他的消息框时,它将获取所有对话(conversation_1)

而不是加入用户 conversation_2 并使用 conversation_2 找出哪个用户

而不是加入消息。

c_id    user_id     user_name   message
1       2           Alex        Hi user_1, this is user_2
2       3           John        hi user_3, user_2 don't talk to me

它工作正常,但是我想显示message最后一行 GROUP BY

目前它显示该组中的第一行。

ps.conversation_1.c_id 是自动递增的,c_id 将插入到已加入此对话的conversation_2

4

2 回答 2

1

请注意,如MySQL Extensions 中所述GROUP BY

MySQL 扩展了 的使用,GROUP BY以便选择列表可以引用未在GROUP BY子句中命名的非聚合列。这意味着前面的查询在 MySQL 中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在每个未在 中命名的非聚合列中的所有值GROUP BY对于每个组都相同时很有用。服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。此外,从每个组中选择值不会受到添加ORDER BY子句的影响。结果集的排序发生在选择了值之后,并且ORDER BY不影响服务器选择每个组中的哪些值。

这就是在现有查询中选择消息(可能还有其他列)时发生的情况。

相反,您想要分组最大值

SELECT messages.* FROM messages NATURAL JOIN (
  SELECT c_id, MAX(m_id) m_id FROM messages GROUP BY c_id
) t
于 2013-07-23T08:16:35.953 回答
1
select * from (SELECT * FROM conversation_1 
LEFT JOIN conversation_2
ON conversation_1.c_id = conversation_2.c_id    
LEFT JOIN user
ON conversation_2.user_id = user.user_id    
LEFT JOIN message
ON conversation_1.c_id = message.c_id    
WHERE conversation_1.user_id=1
order by conversation_1.c_id desc) finalData
GROUP BY message.c_id
于 2013-07-23T09:09:54.517 回答