[英]Counting Distinct Records Using Multiple Criteria From Another Table In MySQL
這不是家庭作業。 我更改了表和字段的名稱,僅出於說明目的。 我承認我是MySQL的新手。 請考慮您的答案。
說明我需要的查詢功能的最佳方法是這樣的:
我有兩張桌子。
一個表與另一表的關系是0..1到0..n。
對於“僅清酒”,假設兩個表分別是“配方”和“成分”。
成分表中的字段之一引用配方表,但可以為空。
僅作為示例:
我想了解類似以下內容的SQL: 有多少配方要求“ 1”的數量是“橄欖”,數量是“ 2”的“蘑菇”?
作為結構化查詢語言的新手,我什至不知道該用谷歌搜索什么。
我在以下方面是否正確?
SELECT COUNT(DISTINCT Recipe.ID) AS Answer FROM Recipe, Ingredient
WHERE Ingredient.RecipeID=Recipe.ID AND Ingredient.Name='Olives'
AND Ingredient.Amount=1 AND Ingredient.Name='Mushrooms'
AND Ingredient.Amount=2
我意識到這是完全錯誤的,因為Name不能同時是Olives And Mushrooms ...,但不知道要放些什么,因為我需要將所有配方都算在內,但要把所有配方都算在內。
如何為MySQL正確編寫這樣的查詢?
你近了
嘗試類似
SELECT COUNT(Recipe.ID) Answer
FROM Recipe INNER JOIN
Ingredient olives ON olives.RecipeID=Recipe.ID INNER JOIN
Ingredient mushrooms ON mushrooms.RecipeID=Recipe.ID
WHERE olives.Name='Olives'
AND mushrooms.Name='Mushrooms'
AND olives.Amount = 1
AND mushrooms.Amount = 2
您可以兩次連接到同一張表,所有要做的就是為該表提供適當的別名 。
使用:
SELECT COUNT(r.id)
FROM RECIPE r
WHERE EXISTS(SELECT NULL
FROM INGREDIENTS i
WHERE i.recipeid = r.id
AND i.name = 'Olives'
AND i.amount = 1)
AND EXISTS(SELECT NULL
FROM INGREDIENTS i
WHERE i.recipeid = r.id
AND i.name = 'Mushrooms'
AND i.amount = 2)
SELECT COUNT(DISTINCT Recipe.ID) AS Answer
FROM Recipe, Ingredient as ing1, Ingredient as ing2
WHERE
Ing1.RecipeID=Recipe.ID AND Ing1.Name="Olives" AND ing1.Amount=1 AND
Ing2.RecipeID=Recipe.ID AND Ing2.Name="Mushrooms" AND ing2.Amount=2;
希望這個幫助
首先,您使用舊的連接語法。 INNER JOIN創建相同的執行計划,但更加清楚。 然后,您的查詢都是關於一個簡單的舊條件的。 您只需要正確編寫它們即可! (我同意,這需要一些練習。)
SELECT COUNT(DISTINCT R.ID) Answer
FROM Recipe R
INNER JOIN Ingredient I
ON R.ID = I.RecipeID
AND (R.Name = 'Olives' AND I.Amount = 1)
OR (R.Name = 'Mushrooms' AND I.Amount = 2);
這是我的示例數據:
mysql> SELECT * FROM Ingredient;
+------+------+--------+----------+
| ID | Name | Amount | RecipeID |
+------+------+--------+----------+
| 1 | I1 | 1 | 1 |
| 1 | I2 | 2 | 1 |
| 1 | I3 | 2 | 1 |
| 1 | I4 | 3 | 1 |
| 1 | I1 | 1 | 2 |
| 1 | I2 | 1 | 2 |
| 1 | I3 | 3 | 2 |
| 1 | I4 | 2 | 2 |
| 1 | I1 | 2 | 3 |
| 1 | I2 | 1 | 3 |
+------+------+--------+----------+
10 rows in set (0.00 sec)
mysql> SELECT * FROM Recipe;
+------+-----------+
| ID | Name |
+------+-----------+
| 1 | Mushrooms |
| 2 | Olives |
| 3 | Tomatoes |
+------+-----------+
3 rows in set (0.00 sec)
我的查詢輸出2,應該這樣。
編輯:實際上,我意識到我的查詢選擇了錯誤的行。 這可以正常工作:
SELECT COUNT(DISTINCT R.Id) Answer
FROM Recipe R
INNER JOIN Ingredient I
ON R.ID = I.RecipeID
WHERE
(R.Name = 'Mushrooms' AND I.Amount = 2)
OR (R.Name = 'Olives' AND I.Amount = 1);
哪個也輸出2。
僅供參考...
多少個食譜要求“橄欖”的數量為“ 1”,而“蘑菇”的數量為“ 2”
查看上面的表格結構,您可能希望關聯實體介於配方和配料之間。 這使得使用內部聯接執行所需的查詢變得容易得多 。
在您的兩個桌子之間,我會想象這樣的事情……
Recipe_Ingredient
-----------------
(PK, FK) RecipeID
(PK, FK) IngredientID
如果有的話,那么每個食譜可能都有很多成分,每種成分可能都是許多食譜的一部分。 一旦有了一個可以正確關聯兩個表的表,就可以將它們連接在一起並獲得完整的配方。 對於像這樣的更復雜的查詢,其中您有兩個配方的單獨條件,我可能會對其進行子查詢以幫助理解。
SELECT SUM(RecipeCount) as RecipeCount
FROM
(
SELECT COUNT(r.*) as RecipeCount
FROM Recipe r
INNER JOIN Recipe_Ingredient ri on r.ID = ri.RecipeID
INNER JOIN Ingredient i on i.ID = ri.IngredientID
WHERE i.Name = 'Olives' AND i.Amount = 1
UNION ALL
SELECT COUNT(r.*) as RecipeCount
FROM Recipe r
INNER JOIN Recipe_Ingredient ri on r.ID = ri.RecipeID
INNER JOIN Ingredient i on i.ID = ri.IngredientID
WHERE i.Name = 'Mushrooms' AND i.Amount = 2
) as subTable
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.