2012-02-02 25 views
1

我想要做的是從一個表(表A)選擇一組特定的行與另一個表聯接(表B),從表A中只會出現一條記錄,並根據日期時間列與來自表B的最近記錄進行連接。從一個表中選擇行,加入其他表最近的一行一到一對多的關係

例如,表A具有這種結構(很大程度上簡化):

id | col_1  | col_2   
---+-----------+---------------- 
1 | something | something else 
2 | val_1  | val_2 
3 | stuff  | ting 
4 | goats  | sheep 

表B看起來是這樣的:

id | fk_A  | datetime_col  | col_3 
---+-----------+---------------------+-------- 
1 | 1   | 2012-02-01 15:42:14 | Note 1 
2 | 1   | 2012-02-02 09:46:54 | Note 2 
3 | 1   | 2011-11-14 11:18:32 | Note 3 
4 | 2   | 2009-04-30 16:49:01 | Note 4 
5 | 4   | 2013-06-21 15:42:14 | Note 5 
6 | 4   | 2011-02-01 18:44:24 | Note 6 

我想是一個結果集,看起來像這樣:

id | col_1  | col_2   | datetime_col  | col_3 
---+-----------+----------------+---------------------+-------- 
1 | something | something else | 2012-02-02 09:46:54 | Note 2 
2 | val_1  | val_2   | 2009-04-30 16:49:01 | Note 4 
3 | stuff  | ting   | NULL    | NULL 
4 | goats  | sheep   | 2013-06-21 15:42:14 | Note 5 

所以你可以看到表B已加入的表A,但只有來自B的最近對應記錄已包含在結果中。

我嘗試了各種組合的SELECT DISTINCTLEFT JOIN和子查詢,我只是無法得到它的工作,我要麼沒有結果或者是這樣的:

id | col_1  | col_2   | datetime_col  | col_3 
---+-----------+----------------+---------------------+-------- 
1 | something | something else | 2012-02-01 15:42:14 | Note 1 
1 | something | something else | 2012-02-02 09:46:54 | Note 2 
1 | something | something else | 2011-11-14 11:18:32 | Note 3 
2 | val_1  | val_2   | 2009-04-30 16:49:01 | Note 4 
3 | stuff  | ting   | NULL    | NULL 
4 | goats  | sheep   | 2013-06-21 15:42:14 | Note 5 
4 | goats  | sheep   | 2011-02-01 18:44:24 | Note 6 

...用來自表A的記錄重複。

顯然,我的SQL福是隻是不適合這個任務不夠好,所以我將不勝感激,如果你一種人能在正確的方向指向我。我已經做了相當多的谷歌搜索和SO摸索的,我還沒有發現這個特定的任務匹配任何東西,但我相信這個問題已經被問過 - 我懷疑的是,我忘了一個SQL關鍵字/不瞭解和如果我搜索,我會立即找到答案。

我認爲this question處理同樣的問題,雖然我不是100%肯定,並且接受的答案涉及SELECT TOP,我認爲(?)在MySQL中無效。

由於我的實際查詢要複雜得多,並加入幾個表,我將表現出來的情況下,它對如何做到這一點任何區別:

SELECT `l` . * , `u`.`name` AS 'owner_name', `s`.`name` AS 'acquired_by_name', `d`.`type` AS `dtype` , `p`.`type` AS `ptype` 
FROM `leads` l 
LEFT JOIN `web_users` u ON `u`.`id` = `l`.`owner` 
LEFT JOIN `web_users` s ON `s`.`id` = `l`.`acquired_by` 
LEFT JOIN `deal_types` d ON `d`.`id` = `l`.`deal_type` 
LEFT JOIN `property_types` p ON `p`.`id` = `l`.`property_type` 

此查詢的工作並返回我想要的數據(有時我還添加了WHERE條款,但能正常工作),但我現在想:

LEFT JOIN `notes` n ON `n`.`lead_id` = `l`.`id` 

...其中notes包含「多條記錄」和leads包含「一個記錄」它們涉及到。

還應該注意的是,我可能還想返回最舊的記錄(在不同的查詢中),但我想這將是一個簡單的例子,在某處反轉ASC/DESC或類似的簡單方法。

回答

4

我認爲這將有助於你:

SELECT A.id, A.col_1, A.col_2, A.datetime_col, A.col_3 
FROM 
    (SELECT B.id, B.col_1, B.col_2, C.datetime_col, C.col_3 
    FROM tableA B LEFT OUTER JOIN tableB C ON B.id = C.id 
    ORDER BY C.datetime_col desc) as A 
GROUP BY A.id 
+1

謝謝,這幫助了很多。 – DaveRandom 2012-02-02 16:26:05

+0

這節省了我的時間,非常感謝你!如果我能兩次投票給你,我會的。 – haakym 2014-03-20 14:42:17

相關問題