返回组合键MYSQL的一半的最大值

问题描述 投票:-1回答:1

我正在尝试查询具有由两个整数组成的复合键的表。关系是enter image description here

因此,我试图获得的结果是,对于每个已开始的对话,我都希望从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是未知列。查询结构有什么问题?更重要的是,有没有一种更简单的方法可以完成我尝试做的事情?

mysql database-design
1个回答
0
投票

似乎您希望每个对话一行,以及对话中的最新消息(即,具有最大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
© www.soinside.com 2019 - 2024. All rights reserved.