2017-09-27 101 views
0

我在表A(一個表)和表B(多表)之間有一對多的關係。MySQL一對多選擇

我想查詢表A,只有從表A,其中它具有表B.至少一行

我想這可能是一個內部聯接,但我仍然得到每個行返回返回項表B.

SELECT * FROM categories.* INNER JOIN images ON images.category_id = categories.id 

這是我當前的查詢入口,我認爲它是一個WHERE條款我需要補充,但我不知道是什麼。

我很抱歉,這是一個這麼簡單的問題,我自己找不到答案,我認爲我錯了。

+0

請提供表結構。 –

+0

您也可以使用http://sqlfiddle.com/提供完整的示例 – kenfire

回答

2

要獲取類別的數據(而不是圖像數據)在表中的至少一個關聯b可以做類似下面

SELECT c.* 
FROM categories c 
INNER JOIN images i ON i.category_id = c.id 
GROUP BY c.id 
HAVING COUNT(DISTINCT i.id) > 0 

還是沒有聚集只是不同的,並加入

SELECT DISTINCT c.* 
FROM categories c 
INNER JOIN images i ON i.category_id = c.id 
+0

我認爲有條款是不需要的。答案是正確的 –

+0

GROUP BY i.category_id –

+0

只用於因爲group by,沒有聚合函數的組不是一個好的做法 –

1

你可以用幾種方法做。 有人可能會關注。它使用EXISTS在WHERE條件:

SELECT * 
FROM categories 
WHERE EXISTS (SELECT 1 FROM images WHERE images.category_id = categories.id) 

另可在子查詢中使用DISTINCT(但我覺得表演是最壞比前):

SELECT * 
FROM categories 
INNER JOIN (SELECT DISTINCT category_id FROM images) images ON images.category_id = categories.id) 
+0

這可能會起作用,但我將按照@kenfire的建議來做,謝謝堆! –

+0

@OliverGiess在我看來,他們不能返回相同的記錄:用RIGHT JOIN,你做了另一件事。 – etsa

+0

我明白你的意思,我很倉促 –

1

您可以使用左/右連接。

SELECT * FROM categories.* I 
RIGHT JOIN images 
ON images.category_id = categories.id 

在你的情況下,我認爲表A是類別和表B圖像。 嘗試使用LEFT JOIN如果是相反的

https://www.w3schools.com/sql/sql_join_left.asp

+0

好主意,扭轉表格,只需選擇那種方式,我應該想到的是,我自己*面對手掌* –

+0

@OliverGiess有些時候你不需要過度考慮它 – kenfire

1

使用此查詢

SELECT c.* 
FROM categories c 
INNER JOIN images i ON i.category_id = c.id 
GROUP BY i.category_id 
+0

你作弊:)。 –

+1

@MKhalidJunaid哈哈哈發生了什麼bro。我非常感謝你的mysql知識 –