mysql连接表选择是否有分组依据

mysql连接表选择是否有分组依据,mysql,Mysql,我有以下两个表格: CREATE TABLE messages ( messageId INT, threadId INT, recipientUserId INT, message TEXT ); CREATE TABLE thread_recipients ( recipientUserId INT, threadId INT ); 我想从消息表中为每个线程选择特定用户的最新消息。我还想从thread_recipients表中获取属于所选线

我有以下两个表格:

CREATE TABLE messages (
    messageId INT,
    threadId INT,
    recipientUserId INT,
    message TEXT
);

CREATE TABLE thread_recipients (
    recipientUserId INT,
    threadId INT
);
我想从消息表中为每个线程选择特定用户的最新消息。我还想从thread_recipients表中获取属于所选线程的所有其他用户

我认为以下方法可行:

SELECT MAX(m.messageId) AS maxMessageId, m.threadId, m.message 
  FROM messages AS m
    RIGHT JOIN thread_recipients AS tr ON tr.threadId=m.threadId
  WHERE m.recipientUserId='2'
  GROUP BY m.threadId
但是,由于GROUP BY,它仅为每个threadId选择一行,而不考虑属于该线程的用户数。甚至可以在一个查询中完成吗


感谢所有响应者。

Oracle只需使用分析函数即可解决此问题:

select max(messageId) over (partition by threadId) ...
调用聚合函数非常方便,无需GROUPBY子句,非常适合您的情况

然而,在MYSQL中,使用一个内部select来模拟这一点,但是请记住,对于非常大的表,它们可能会占用大量内存

SELECT mm.maxMessageId, m.threadId, m.message 
FROM messages AS m RIGHT JOIN thread_recipients AS tr ON tr.threadId=m.threadId, 
(
   select threadId, max(messageId) as maxMessageId
   from messages group by threadId
) AS mm
WHERE m.recipientUserId=2
  AND m.threadId = mm.threadId

反勾号用于内联代码。对于,使用四个额外空格缩进行。编辑器工具栏中的{}按钮可以为您执行此操作。单击编辑器工具栏中的橙色问号,了解有关格式设置的详细信息和提示。表结构应使用SQL语句显示。既然您只是询问SQL,就不需要将其作为某些PHP代码的一部分发布。消息中的recipientUserId和线程接收者之间的区别是什么?它们是如何使用的?我不明白,也猜不到,你的模式是什么RecipientUserId是一个INT,所以不需要将值2放在单引号中隐式类型转换可能会阻止索引的使用你是对的,我只是盲目地试图保持他的陈述不变,以强调更改:谢谢@edvaldig。。。我会试试你的答案。。。那么,在一张有数百万条信息的桌子上,你如何实现这一点呢?。。。我真的想实现一个消息系统的功能,如facebook。。。问候J@jon您可以通过将内部查询限制为具有相同recipientUserId的消息来限制其大小。如果你这么做了,那么我怀疑你是否需要如此担心性能。