【问题标题】:SQL: Select conversations GROUP BY with last record from another tableSQL:从另一个表中选择带有最后一条记录的对话 GROUP BY
【发布时间】:2014-03-30 03:57:46
【问题描述】:

我有以下问题。我有两张桌子:

baz_conversations

con_id, con_users, con_date

baz_con_messages

message_id, message_con_id, message_text, message_author

我想显示我的所有对话 - 表 baz_conversations 中的 con_users 必须包含来自该对话另一个表的最后一条消息的 myID。我花了太多时间来编写这个简单的 sql select,但它从表 baz_con_messages 中选择了第一个而不是最后一个消息。谢谢您的回答。这是我的代码:

SELECT m.*, c.* FROM baz_conversations AS c RIGHT JOIN 
                     baz_con_messages AS m ON c.con_id = m.message_con_id
WHERE c.con_users LIKE '%1,%' 
GROUP BY c.con_id 
ORDER BY m.message_id DESC 
LIMIT 1

【问题讨论】:

  • 您使用的是 SQL Server 还是 MySQL 的数据库?你应该只用你真正使用的数据库来标记你的问题。从limit的使用来看,我猜是MySQL。

标签: mysql sql sql-server


【解决方案1】:

我想你想要这样的东西:

SELECT m.*, c.*
FROM baz_conversations c JOIN 
     baz_con_messages m
     ON c.con_id = m.message_con_id
WHERE c.con_users LIKE '%1,%' AND
      not exists (select 1
                  from baz_con_messages m2
                  where m2.message_con_id = m.message_con_id and
                        m2.message_id > m.message_id
                 );

【讨论】:

    【解决方案2】:

    尝试使用自连接,当您使用 GROUP BY 按一些常见值时,您的结果会被分组但不是按顺序排列,因此您不能指望使用 group by 它会为您提供组的最新结果,因此你的情况你需要来自对话组的最后一条消息ID我在baz_conversations上使用另一个加入作为自加入但是这次我使用子查询来获取消息ID的最大值以及对话ID并在两个条件下加入,即USING(message_id , message_con_id )所以第一个baz_con_messages 加入了新的最大值结果集,其中会话ID 是常见的,并且两个结果集都与消息ID 匹配,因此结果根据MAX(message_id) 返回每​​个会话组只有一个

    SELECT 
      m.*,
      c.* 
    FROM
      baz_conversations AS c 
       JOIN baz_con_messages AS m 
       ON c.con_id = m.message_con_id 
       JOIN 
      (SELECT MAX(message_id) message_id , message_con_id
        FROM baz_con_messages GROUP BY message_con_id
       ) m2
       USING(message_id , message_con_id )
    WHERE c.con_users LIKE '%1,%' 
    ORDER BY m.message_id DESC 
    

    【讨论】:

    • 谢谢。你说的对。它有效,但你能告诉我更多关于你的答案吗?我不理解您的 sql 查询:/ 请,如果您能描述查询的各个部分,我将非常高兴。再次非常感谢。
    • @user3354689 查看我的更新答案希望它有意义
    猜你喜欢
    • 2019-06-29
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2021-01-26
    • 1970-01-01
    • 2023-04-07
    • 2010-10-01
    相关资源
    最近更新 更多