2016-02-24 68 views
0

我有三個表,products,ingredientsingredient_productMySQL從多對多關係中選擇父行

我需要找到所有的products,其中產品有相關的成分。 它還需要在percentage列上具有匹配值。

產品存在與兩個相關的成分。

+-----+------------+---------------+------------+ 
| id | product_id | ingredient_id | percentage | 
+-----+------------+---------------+------------+ 
| 1 |   1 |   1 |   50 | 
| 2 |   1 |   2 |   50 | 
+------------------+--------------+-------------+ 

SQL檢索:

SELECT 
     products.id 
    FROM 
     products, 
     ingredient_product 
    WHERE 
     ingredient_product.product_id = products.id 
    AND 
     (ingredient_product.ingredient_id = 1 AND ingredient_product.percentage = 50) 
    AND 
     (ingredient_product.ingredient_id = 2 AND ingredient_product.percentage = 50) 

但這返回一個空的結果。 Empty set (0.00 sec)

產品:

+-------------------+-----------------------+------+-----+---------+----------------+ 
| Field    | Type     | Null | Key | Default | Extra   | 
+-------------------+-----------------------+------+-----+---------+----------------+ 
| id    | int(10) unsigned  | NO | PRI | NULL | auto_increment | 
| name    | varchar(255)   | NO |  | NULL |    | 
| short_description | text     | YES |  | NULL |    | 
| long_description | text     | YES |  | NULL |    | 
+-------------------+-----------------------+------+-----+---------+----------------+ 

主料:

+-------------------+-----------------------+------+-----+---------+----------------+ 
| Field    | Type     | Null | Key | Default | Extra   | 
+-------------------+-----------------------+------+-----+---------+----------------+ 
| id    | int(10) unsigned  | NO | PRI | NULL | auto_increment | 
| short_name  | varchar(50)   | NO |  | NULL |    | 
| thumbnail   | varchar(255)   | NO |  | NULL |    | 
+-------------------+-----------------------+------+-----+---------+----------------+ 

ingredient_product

+---------------+---------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+---------------+---------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| product_id | int(10) unsigned | NO | MUL | NULL |    | 
| ingredient_id | int(10) unsigned | NO | MUL | NULL |    | 
| percentage | tinyint(3) unsigned | NO |  | NULL |    | 
+---------------+---------------------+------+-----+---------+----------------+ 
+0

兩個AND子句不能在同一時間如此,使用ingredient_product.ingredient_id IN(1,2) – mitkosoft

+0

@mitkosoft如果您有SQL來解決這個問題,請把它作爲答覆。這樣我可以接受。 – CharliePrynn

+0

什麼是期望的輸出? – mitkosoft

回答

2

SELECT product_id 
FROM ingredient_product 
WHERE ingredient_id IN (1,2) AND percentage = 50 
GROUP BY product_id 
HAVING COUNT(*) = 2; 

但是如果你需要獨立的百分比,這並不工作,但你可以這樣做:

SELECT product_id FROM 
    (SELECT product_id 
    FROM ingredient_product 
    WHERE ingredient_id = 1 AND percentage = 50 
    UNION ALL 
    SELECT product_id 
    FROM ingredient_product 
    WHERE ingredient_id = 2 AND percentage = 50) AS tmp 
GROUP BY product_id 
HAVING COUNT(*) = 2; 

基本上你添加一個UNION每個要求(由id和百分比組合組成),然後增加HAVING條件的要求數量。

備註:由於要求在這種情況下相互排斥,因此UNION ALLUNION更快,並且會給出相同的結果。

在子查詢中,您可以使用OR而不是UNION,但我們發現MySQL似乎更喜歡這種格式。然而,不同的版本可能會有所不同。爲了完整起見,在這裏,解決方案,以及:

SELECT product_id 
FROM ingredient_product 
WHERE (ingredient_id = 1 AND percentage = 50) OR (ingredient_id = 2 AND percentage = 50) 
GROUP BY product_id 
HAVING COUNT(*) = 2; 
0

在假設ID是多餘的,和你有一個完美的維修自然鍵( product_id,ingredient_id)...

基於草莓答案
SELECT product_id 
    FROM ingredient_product 
WHERE ingredient_id IN (1,2) 
GROUP 
    BY product_id 
HAVING COUNT(*) = 2; 
+0

這與數據透視表上的百分比列不匹配。 – CharliePrynn

+0

如果我的問題不清楚,讓我知道哪一點,我會嘗試澄清。 – CharliePrynn

+0

@CharliePrynn我知道。看看你能否發現這一點。 – Strawberry