我有两张桌子,对话和消息, 我想做的是从对话到消息进行内部联接。
这是我的问题:
SELECT
messages.msg,
messages.`read`,
conversations.userid,
conversations.contactid
FROM conversations
INNER JOIN messages ON
conversations.id = messages.convId
WHERE conversations.id IN(443,444)
现在一切都按预期工作,但最后一件事就是在我使用
的内连接中conversations.id = messages.convId
我想获得最高的ID,例如:
AND MAX(messages.id)
但这不起作用
修改 我试过一次使用:
LEFT JOIN messages
ON conversations.id = messages.convId
AND messages.id = MAX(messages.id)
但我得到一个错误说:组功能的使用无效。
答案 0 :(得分:15)
修改强>
这会有效!
SELECT conversations.*, m1.*
FROM conversations
LEFT JOIN messages m1
ON conversations.id = m1.cid
AND m1.id = (
SELECT MAX(m2.id)
FROM messages m2
WHERE m2.cid = conversations.id
)
答案 1 :(得分:2)
您正在寻找组中的最大值。 MySQL没有任何明显的方法可以做到这一点(很多方法都有点诡计)。
但是,你只是在寻找两个小组。因此,您可以在每个组中查找限制,并使用union all
:
SELECT m.msg, m.`read`, c.userid,
c.contactid
FROM conversations c inner join
((select m.*
from messages m
where m.convid = 443
order by m.id desc
limit 1
) union all
(select m.*
from messages m
where m.convid = 444
order by m.id desc
limit 1
)
) m
ON c.id = m.convId;
如果您在messages(convid, id)
和conversations(id)
上有索引,那么这应该非常快。
您也可以使用更标准的方法来实现这一目标:
SELECT m.msg, m.`read`, c.userid,
c.contactid
FROM conversations c inner join
messages m
ON c.id = m.convId
where c.convId in (443, 444) and
m.id = (select max(id) from messages m2 where m2.convId = c.convId)
答案 2 :(得分:1)
上面的顶级解决方案不能在任何地方都可以使用,例如postgres会给出错误,是一种更好的连接表的解决方案,并且只能从另一个表中获取最大ID:
SELECT conversations.*, m.*
FROM conversations
JOIN (SELECT cid, max(id) as m_id from messages group by cid) as m
ON conversations.id = m.cid