因此,我试图获得的结果是,对于每个已开始的对话,我都希望从messages表中获得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
我期望的session_Id和threadNum的结果是:35 534 433 55
每个对话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