Mysql

如何從與其他表相關的表中獲取行數?

  • February 23, 2021

我是 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

ALEFT 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

引用自:https://dba.stackexchange.com/questions/285878