如何在mysql中获取组中的最新行?

时间:2015-02-17 23:57:45

标签: php mysql join inner-join

在我的mysql查询中,我尝试使用最近的行获取所有线程。

    $query = "SELECT th.id, tm.message, tm.date_sent, tm.date_sent>tu.last_read_date AS new
              FROM thread th
              JOIN thread_user tu ON th.id=tu.thread_id AND tu.user_id={$user_id}
              JOIN thread_message tm ON th.id=tm.thread_id
              JOIN (
                   SELECT thread_id, MAX(date_sent) date_sent
                   FROM thread_message
                   GROUP BY thread_id
              ) q ON tm.thread_id = q.thread_id AND tm.date_sent = q.date_sent
              ORDER BY tm.date_sent DESC";  

这样可行,但问题是,如果有两行或更多行的日期是最新的并且它们是相同的日期,那么它将同时加入它们。我需要第三个连接语句加入最多1行。

我也不想假设最大的ID意味着它是最近的一行,因为我总是可以在以后手动更改日期。

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

由于

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是为每个组建立一个行号,在这种情况下,您的论坛为thread_iddate_sent。使用MySql,您需要使用user-defined variables执行此操作:

SELECT th.id, 
    tm.message, 
    tm.date_sent, 
    tm.date_sent>tu.last_read_date AS new
FROM thread th
    JOIN thread_user tu ON th.id=tu.thread_id AND tu.user_id={$user_id}
    JOIN (
        SELECT id,
               thread_id, 
               message, 
               date_sent, 
               @rn:=IF(@prevthread_id=thread_id, @rn+1, 1) rn,
               @prevthread_id:=thread_id
        FROM thread_message, (SELECT @rn:=1, @prevthread_id:=0) t
        ORDER BY thread_id, date_sent DESC, id
    ) tm ON th.id=tm.thread_id
           AND tm.rn = 1 
ORDER BY tm.date_sent DESC

也许这对您来说更容易(但只是因为您正在使用mysql):

SELECT th.id, 
    tm.message, 
    tm.date_sent, 
    tm.date_sent>tu.last_read_date AS new
FROM thread th
    JOIN thread_user tu ON th.id=tu.thread_id AND tu.user_id={$user_id}
    JOIN thread_message tm ON th.id=tm.thread_id
    JOIN (
        SELECT thread_id, 
               id, 
               MAX(date_sent) date_sent
        FROM thread_message
        GROUP BY thread_id
    ) q ON tm.thread_id = q.thread_id 
           AND q.id = tm.id 
           AND tm.date_sent = q.date_sent
ORDER BY tm.date_sent DESC

这将返回任意id加入。

答案 1 :(得分:0)

在我看来,如果查询产生了您所期望的内容,除了上一个JOIN之外,您只需修改GROUP BY即可返回一行。

JOIN (
      SELECT thread_id, MAX(date_sent) date_sent
      FROM thread_message
      GROUP BY thread_id
      ) q ON tm.thread_id = q.thread_id AND tm.date_sent = q.date_sent
      GROUP BY tm.date_sent
      ORDER BY tm.date_sent DESC";