Mysql
如何從與其他表相關的表中獲取行數?
我是 mysql 和數據庫概念的新手,我將嘗試通過這兩個最小的表來解釋我的問題,這是我需要編寫查詢的場景,
表:水果 | 水果ID | 水果名稱 | | -------- | -------------- | | 1 | 芒果 | | 2 | 蘋果 | | 3 | 木瓜 | 表:水果子類 | FruitSubClassID | 水果子類 | 水果ID| | ---------- -----| --------------- |-----------| | 100 | 阿方索 |1| | 101 | 歐文 |1| | 200 | Fuji |2| | 201 | 金冠|2|
我想從表 1 中獲取所有此類水果的數據,以便表 2 中沒有這些水果(無子類)的行。從我搜尋的內容來看,我認為我需要使用 Joins 和 Count 但我不知道如何在這種情況下使用它們。
我可以將其描述為“對於 Fruits 中的每個 FruitID,從 Fruits 中獲取 FruitID 和 FruitName,以便 FruitSubClasses 中不存在此 FruitID”,但無法對此進行有效查詢。
您需要一個
OUTER JOIN
來解決這個問題,特別是像這樣的LEFT OUTER JOIN
(也稱為LEFT JOIN
):SELECT F.FruitID, F.FruitName FROM Fruits F LEFT JOIN FruitSubClasses FSC ON F.FruitID = FSC.FruitID WHERE FSC.FruitID IS NULL
A
LEFT JOIN
從子句左側的表中返回所有行,JOIN
而不考慮子句謂詞中的匹配ON
。對於右側沒有匹配項的行,NULL
將返回右側表的列的值。知道了這一點,我們就可以過濾掉JOIN
與上面的WHERE
子句匹配的任何東西,只得到不匹配的Fruits
(不存在於 中的FruitSubClasses
)。如果您只想要單個標量值中的行數,您可以使用上面的相同查詢和
COUNT(*)
函式,如下所示:SELECT COUNT(*) FROM Fruits F LEFT JOIN FruitSubClasses FSC ON F.FruitID = FSC.FruitID WHERE FSC.FruitID IS NULL