Mysql SQL:从另一个表中选择具有最后一条记录的对话分组依据
我有以下问题。我有两张桌子: baz_对话Mysql SQL:从另一个表中选择具有最后一条记录的对话分组依据,mysql,sql,sql-server,Mysql,Sql,Sql Server,我有以下问题。我有两张桌子: baz_对话 con_id, con_users, con_date baz_con_消息 message_id, message_con_id, message_text, message_author 我想显示我的所有对话——表baz_对话中的con_用户必须包含myID以及来自该对话另一个表的最后一条消息。我花了太多时间编写这个、、easy、、sql select,但它选择了表baz_con_messages中的第一条消息,而不是最后一条消息。谢谢你的回答
con_id, con_users, con_date
baz_con_消息
message_id, message_con_id, message_text, message_author
我想显示我的所有对话——表baz_对话中的con_用户必须包含myID以及来自该对话另一个表的最后一条消息。我花了太多时间编写这个、、easy、、sql select,但它选择了表baz_con_messages中的第一条消息,而不是最后一条消息。谢谢你的回答。这是我的密码:
SELECT m.*, c.* FROM baz_conversations AS c RIGHT JOIN
baz_con_messages AS m ON c.con_id = m.message_con_id
WHERE c.con_users LIKE '%1,%'
GROUP BY c.con_id
ORDER BY m.message_id DESC
LIMIT 1
我想你想要这样的东西:
SELECT m.*, c.*
FROM baz_conversations c JOIN
baz_con_messages m
ON c.con_id = m.message_con_id
WHERE c.con_users LIKE '%1,%' AND
not exists (select 1
from baz_con_messages m2
where m2.message_con_id = m.message_con_id and
m2.message_id > m.message_id
);
尝试使用自连接,当您使用
GROUP BY
BY一些常用值时,您的结果是分组的,但不是按顺序排列的,因此您不能期望使用GROUP BY,它将为您提供组的最新结果,因此对于您的情况,您需要对话组的最后一个消息id。我在baz_对话中使用另一个连接作为自连接,但这次我使用了用于获取消息id和会话id的最大值的子查询,并在两个条件下进行联接,即使用(消息id,消息id)
因此,第一条baz_con_消息
与新的maxima resultset连接,其中会话id是公共的,并且两个结果集都与消息id匹配,因此根据MAX(message_id)
每个会话组只返回一个结果
SELECT
m.*,
c.*
FROM
baz_conversations AS c
JOIN baz_con_messages AS m
ON c.con_id = m.message_con_id
JOIN
(SELECT MAX(message_id) message_id , message_con_id
FROM baz_con_messages GROUP BY message_con_id
) m2
USING(message_id , message_con_id )
WHERE c.con_users LIKE '%1,%'
ORDER BY m.message_id DESC
您使用的是什么数据库SQL Server或MySQL?你应该只使用你真正使用的数据库来标记你的问题。从
limit
,我猜是MySQL。谢谢。你是对的。它是有效的,但是你能告诉我更多关于你的答案吗。我不理解您的sql查询:/please,如果您能描述查询的各个部分,我将非常高兴。再次非常感谢。@user3354689查看我的更新答案,希望有意义