2013-03-25 131 views
84

我讀了很多關於只獲取左連接的第一行的線程,但由於某種原因,這對我不起作用。LEFT JOIN只有第一行

這是我的結構(簡化當然)

訂閱

id | title | content 
---------------------- 
1 | Feed 1 | ... 

藝術家

artist_id | artist_name 
----------------------- 
1   | Artist 1 
2   | Artist 2 

feeds_artists

rel_id | artist_id | feed_id 
---------------------------- 
1  |  1  | 1 
2  |  2  | 1 
... 

現在我想要得到的文章,並加入只有第一個藝術家,我想的是這樣的:

SELECT * 
    FROM feeds 
    LEFT JOIN feeds_artists ON wp_feeds.id = (
     SELECT feeds_artists.feed_id FROM feeds_artists 
     WHERE feeds_artists.feed_id = feeds.id 
    LIMIT 1 
    ) 
WHERE feeds.id = '13815' 

只是爲了讓只有feeds_artists的第一行,但已經這樣不起作用。

我不能使用TOP,因爲我的數據庫,我可以爲我不需要按feeds_artists.artist_id結果按日期對它們進行排序(我通過編組他們這樣得到的結果,但結果不何處最新)

嘗試了一些與外部應用 - 以及沒有成功。 說實話,我真的不能想象在這些行中發生了什麼 - 可能是我無法得到這個工作的最大原因。

SOLUTION:

SELECT * 
FROM feeds f 
LEFT JOIN artists a ON a.artist_id = (
    SELECT artist_id 
    FROM feeds_artists fa 
    WHERE fa.feed_id = f.id 
    LIMIT 1 
) 
WHERE f.id = '13815' 
+0

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html – Sinux 2016-06-21 03:12:12

+0

這裏是解決方案https://stackoverflow.com/a/7588442/612987 – 2018-01-13 16:40:31

回答

68

如果你可以假設,藝術家ID的增量隨着時間的推移,那麼MIN(artist_id)將是最早的。

所以嘗試這樣的事情(未經測試...)

SELECT * 
    FROM feeds f 
    LEFT JOIN artists a ON a.artist_id = (
    SELECT 
     MIN(fa.artist_id) a_id 
    FROM feeds_artists fa 
    WHERE fa.feed_id = f.feed_id 
) a 
+0

感謝您的快速響應。這不是確切的答案,但完全讓我走上了正確的道路。我一直試圖在同一層面上加入,而不是讓另一個依賴於另一個。非常感謝您帶領我走上正軌。編輯第一篇文章 – KddC 2013-03-25 23:39:33

+0

@KddC而不是修改問題以添加答案,編輯此答案或自己做答案。 – PhoneixS 2015-08-12 11:47:13

+3

不會在這一個簡單的子查詢會更好嗎?因爲現在你有一個連接和一個子查詢。只是問起因爲我正在尋找解決同樣的問題:) – galdikas 2016-02-11 10:36:33

46

版本無子查詢:

SELECT f.title, 
      f.content, 
      MIN(a.artist_name) artist_name 
    FROM feeds f 
LEFT JOIN feeds_artists fa ON fa.feed_id = f.id 
LEFT JOIN artists a ON fa.artist_id = a.artist_id 
GROUP BY f.id 
+1

我認爲這應該是被接受的答案 – Binod 2016-04-23 10:11:22

+2

我不認爲這將是第一行(第一個id或其他第一個),它只是從左連接行中隨機選擇一個。 – Sinux 2016-06-21 03:04:22

+15

此查詢是錯誤的。它將選擇「最低」藝術家姓名而不是集合中第一批藝術家的姓名。 – Glapa 2016-08-12 16:54:00

3

版本沒有子查詢將加入只有第一作者:

SELECT f.title, 
     f.content, 
     a.artist_name artist_name, 
     min(a.id) as m 
FROM feeds f 
LEFT JOIN feeds_artists fa ON fa.feed_id = f.id 
LEFT JOIN artists a ON fa.artist_id = a.artist_id 
GROUP BY f.id 
HAVING a.id = m; 
+0

這與Denis的迴應有同樣的問題 - 你會得到一個隨機的行加入,而不是第一個。 – Ether 2016-09-14 20:16:12

+0

@Ether不,它沒有相同的問題。最後我有'HAVING'。 – Glapa 2016-11-22 16:38:14

+2

@Glapa,但當'feeds_artists'已被聚合時'HAVING'應用於'GROUP BY'後面。 – 2016-12-07 13:38:11

0

我使用過別的東西(我認爲更好...)並且想分享它:

我創建了一個具有至少一個「組」條款

CREATE VIEW vCountries AS SELECT * PROVINCES GROUP BY country_code 

SELECT * FROM client INNER JOIN vCountries on client_province = province_id 

我想還沒有說,我認爲我們需要的,因爲我們做錯了什麼事在分析中做到這一點的解決方案......一個VIEW在我的情況下...但有時這樣做更便宜,重新設計一切...

我希望它有幫助!