【问题标题】:How to use group by with join in mysql?如何在mysql中使用group by和join?
【发布时间】:2014-01-25 05:41:40
【问题描述】:

这是我的mysql查询:

SELECT t.id,
       t.user_id_1,
       t.user_id_2,
       m.id as message_id,
       m.from_user_id,
       m.text,
       max(m.date_sent),
       m.viewed
FROM   thread t
       JOIN message m 
            ON t.id = m.thread_id
WHERE t.user_id_1 = 1 
      OR t.user_id_2 = 1
GROUP BY t.id

有两个表,线程和消息。线程表存储记录(每条记录是一个会话),消息表存储消息。它将有一个指向线程表的外键来指示消息在哪个线程中。

我正在尝试获取线程列表,以及每个线程的最新消息。但上述方法不起作用。

我想要做的是,它获取所有线程,并将其与消息(在该线程中)连接起来。然后按线程 id 对消息进行分组,并使用 max 函数给出的最近日期的记录。

但它会给出一些带有最近日期的随机消息(该消息来自不同的记录)。

有谁知道如何解决这个问题?

【问题讨论】:

    标签: mysql select join group-by


    【解决方案1】:

    您可以有一个单独的子查询,用于获取表 message 上每个 thread_id 的最新 date_sent。由于子查询只有两列,因此您需要将表本身的结果连接起来以获取其他结果,前提是它在两列上都匹配:thread_iddate_sent

    SELECT  t.id, 
            t.user_id_1, 
            t.user_id_2, 
            m.id as message_id, 
            m.from_user_id, 
            m.text, 
            m.date_sent, 
            m.viewed
    FROM    thread t
            INNER JOIN message m 
                ON t.id = m.thread_id
            INNER JOIN
            (
                SELECT  thread_id, MAX(date_sent) date_sent
                FROM    message
                GROUP   BY thread_id
            ) s ON  m.thread_id = s.thread_id
                    AND m.date_sent = s.date_sent
    WHERE   1 IN (t.user_id_1, t.user_id_2)
    

    【讨论】:

      猜你喜欢
      • 2020-04-28
      • 2016-03-06
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 2020-05-17
      相关资源
      最近更新 更多