通过获取最后一行的Mysql组

时间:2013-07-23 08:02:43

标签: php mysql

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 build

我创建了4个表用户,conversation_1,conversation_2,消息

当用户尝试打开其消息框时,它会提取所有会话(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

目前显示该组中的第1行。

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

2 个答案:

答案 0 :(得分:1)

请注意,如MySQL Extensions to 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 不会影响服务器选择的每个组中的值。

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

相反,您需要groupwise maximum

{{1}}

答案 1 :(得分: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