[英]Returning the Max value of a half the composite key MYSQL
结果我想要得到的是对于每个已经开始的对话,我想要消息表中的 MAX(threadNum) 。 目前查询是
SELECT c.conversation_id
FROM conversation as c
INNER JOIN (
SELECT MAX(threadNum), user_from, user_to, message, dateTime, deleted,replied
FROM messages
GROUP BY conversation_id
) as m ON c.conversation_id = m.conversation_Id
WHERE (m.user_to ='$userId' OR m.user_from ='$userId') AND m.deleted = 0
我对 conversation_Id 和 threadNum 的预期结果是:35 5 34 4 33 55
每个 conversation_Id 一个结果,并且只有最大的 threadNum 结果。 目前我得到一个 m.converation_Id 是一个未知的列。 查询结构有什么问题? 更重要的是,有没有更简单的方法来做我想做的事情?
看起来您想要每个对话一行,以及对话中的最新消息(即具有最大thread_id
的消息)。
如果是这样,那就是每组前 1 个问题。 您可以通过使用相关子查询进行过滤来解决它:
select c.*, m.*
from conversation c
inner join messages m on m.conversation_id = c.conversation_id
where m.thread_num = (
select max(m1.thread_num)
from messages m1
where
m1.conversation_id = m.conversation_id
and m.deleted = 0
and :user_id in (m.user_from, m.user_to)
)
:user_id
表示您的查询的查询参数(您应该使用参数化查询而不是将变量转换为查询字符串)。
或者,如果您正在运行 MySQL 8.0,您可以使用row_number()
:
select *
from (
select
c.*,
m.*,
row_number() over(partition by c.conversation order by m.thread_num desc) rn
from conversation c
inner join messages m on m.conversation_id = c.conversation_id
where m.deleted = 0 and :user_id in (m.user_from, m.user_to)
) t
where rn = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.