2011-04-26 33 views
1

我有一個SQL查詢,左加入一個表。這會導致主表中的行被複制,但與JOINed表中的行不同。如何僅從JOINed表中選擇具有最高日期的行。從左加入中選擇最大的行

下面是一個例子(這是從我的查詢結果):

ID Message Date 
--------------------------- 
0  Hi   2011-01-01 
0  Bye  2011-02-05 
0  Hello  2011-04-20 
1  Test  2010-12-31 
1  Testing 2010-11-15 
2  Something 2010-12-12 
2  Nothing 2011-01-01 
2  Yes  2010-02-05 
3  Cool  NULL 

我想每個ID一行,具有最高ID的行。

ID Message Date 
--------------------------- 
0  Hello  2011-04-20 
1  Test  2010-12-31 
2  Nothing 2011-01-01 
3  Cool  NULL 

我當前的查詢是這樣(我只是有點做這件事,但它是類似於真實的):

SELECT t1.ID, t2.Message, t2.Date 
FROM t1 
LEFT JOIN (
    SELECT t3.ID, t3.message, t3.Date 
    FROM t3 
    LEFT JOIN t4 ON t4.userID = 12 AND t3.ID = t4.ID 
    WHERE t4.color = 'blue' 
) AS t2 
ON t1.ID = t2.ID 
WHERE t1.userID = 12 

我想我可以在結果使用PHP和循環,挑出我想要的,但我可以讓MySQL爲我做這件事嗎?

編輯:對不起,我的第一個例子是方式錯了,這更像是我想要的。

編輯2:我嘗試使用GROUP BY和MAX,但我認爲我做錯了什麼。

我想:

SELECT t1.ID, t2.Message, MAX(t2.Date) 
FROM t1 
LEFT JOIN (
    SELECT t3.ID, t3.message, t3.Date 
    FROM t3 
    LEFT JOIN t4 ON t4.userID = 12 AND t3.ID = t4.ID 
    WHERE t4.color = 'blue' 
) AS t2 
ON t1.ID = t2.ID 
WHERE t1.userID = 12 
GROUP BY t1.ID 

但是,這給了我:

ID Message Date 
--------------------------- 
0  Hi   2011-04-20 
1  Test  2010-12-31 
2  Something 2011-01-01 
3  Cool  NULL 

如何獲得最高的日期相關聯的消息。

+0

內部內查詢,把一組通過對ID,然後選擇日期最大.... – 2011-04-26 18:38:57

+0

這是我很難效仿的榜樣,但它看起來像你沿着正確的線是。可能需要更長的帖子,但是你能把一些表格結構/樣本數據放在一起嗎? – 2011-04-26 18:39:36

+0

@Rocket - t3的主鍵是't3.Id'還是純粹是't1'表的外鍵? – Thomas 2011-04-26 18:43:43

回答

1

像這樣:

SELECT 
    t1.ID, 
    t1.Message, 
    MAX(t2.Date) as [Date] 
FROM t1 
    LEFT JOIN (
    SELECT t3.ID, t3.Date 
    FROM t3 
    LEFT JOIN t4 ON t4.userID = 12 AND t3.ID = t4.ID 
    WHERE t3.color = 'blue' 
) AS t2 
ON t1.ID = t2.ID 
WHERE t1.userID = 12 
GROUP BY t1.ID, t1.Message 

您可以在選擇列表使用GROUP BY到組上的限制,你必須組的所有價值一定值,除非它是一個聚合函數MAX

+0

謝謝,這實際上有效,但我意識到我的問題是錯誤的。我修正了我的例子,所以這不再有效。 – 2011-04-26 19:02:35

+0

我實際上設法通過在子查詢中使用GROUP BY和ORDER BY來解決它 – 2011-04-26 20:01:35

4
Select t1.id, t1.Message, t3.date 
From t1 
    Left Join t3 
     On t3.id = t1.id 
      And t3.id = (
         Select Max(t3_1.Id) 
         From t3 As t3_1 
         Where t3_1.id = t3.id 
         Having Max(t3_1.date) = t3.date 
         ) 
Where t1.userID = 12 

據我所知道的,加盟t4戲劇查詢沒有任何一部分。它不會篩選結果,也不會篩選Select子句中顯示的t4表中的任何內容。另外,我假設列t3.id實際上是t1表的外鍵,而不是主鍵。如果它是主鍵,則不需要用於最大日期的其他過濾器。


更新給定的問題修訂

通過添加標準WHERE子句上t4,你已經有效地它轉換爲內部連接。然而,一個解決辦法是:

Select t1.id, t3.Message, t3.date 
From t1 
    Left Join t3 
     On t3.id = t1.id 
      And t3.id = (
         Select Max(t3_1.Id) 
         From t3 As t3_1 
          Join t4 
           On t4.id = t3_1.id 
         Where t4.color = 'blue' 
          And t3_1.id = t3.id 
         Having Max(t3_1.date) = t3.date 
         ) 
Where t1.userID = 12 
+0

現在檢查問題,我完全寫錯了,這個例子更像我現在想要的。 – 2011-04-26 19:01:54