繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM