如何在mysql中使用group by?

时间:2014-01-25 05:41:41

标签: mysql select join group-by

这是我的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函数给出的最近日期的记录。

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

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

1 个答案:

答案 0 :(得分:2)

您可以拥有一个单独的子查询,为表date_sent上的每个thread_id获取最新的message。由于子查询只有两列,因此您需要将结果连接到表本身,以获得其他列匹配的结果: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)