簡體   English   中英

使用MySQL中另一個表的多個條件對不同的記錄進行計數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM