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