我想要做的是從一個表(表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 DISTINCT
,LEFT 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或類似的簡單方法。
謝謝,這幫助了很多。 – DaveRandom 2012-02-02 16:26:05
這節省了我的時間,非常感謝你!如果我能兩次投票給你,我會的。 – haakym 2014-03-20 14:42:17