2015-02-17 27 views
0

在我的mysql查詢中,我嘗試使用最近一行獲取所有線程。如何在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暗示它是最近的一行,因爲我可以隨時手動更改日期。

有誰知道如何解決這個問題?

感謝

做到這一點
+0

什麼決定了哪些消息應該在關係之間返回?您可以爲每個組建立一個行號,然後僅返回每個集合中的第一個... – sgeddes 2015-02-18 00:04:28

+0

如果線程中有多條消息具有相同的最近日期,那麼它應該選擇具有最大id值的消息。我該如何做行號建立? – omega 2015-02-18 00:05:31

+0

其實,如果最大的id不是最近的日期那一行呢? – omega 2015-02-18 00:11:31

回答

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加入。

+0

這仍然有加入與最近的日期相同的兩行的問題。 – omega 2015-02-18 00:25:59

+0

@omega - 嗯,也許我誤解了一些東西,樣本數據和期望的結果會讓這更容易。然而,考慮到你使用的是mysql,審查編輯... – sgeddes 2015-02-18 00:35:37

+0

@omega - 也更新了行號程序,因爲我現在認爲我理解你的數據結構。 – sgeddes 2015-02-18 00:44:45

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"; 
+0

如果你這樣做,那麼你可以返回與另一個線程ID相關的最大日期。另外還有一個問題,就是最近的日期沒有得到最大ID。 – omega 2015-02-18 00:32:17

+0

第二個怎麼回事? – EternalHour 2015-02-18 00:34:20

相關問題