Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL多对多过滤器_Php_Mysql_Sql - Fatal编程技术网

Php MySQL多对多过滤器

Php MySQL多对多过滤器,php,mysql,sql,Php,Mysql,Sql,我对以下表格进行了多对多分析: 1) 收据 2) 配料 -id -name -recept_id -ingredient_id 3) 收据成分 -id -name -recept_id -ingredient_id 现在我想找到有配料清单的收据。例如,所有含有“番茄”和“香蒜酱”成分的收据。(而不是只有“西红柿”或“香蒜酱”的收据。查询结果会是什么样子?试试这个 SELECT * FROM (SELECT * FROM ingredients AS i LEFT JOIN `rece

我对以下表格进行了多对多分析:

1) 收据

2) 配料

-id
-name
-recept_id
-ingredient_id
3) 收据成分

-id
-name
-recept_id
-ingredient_id
现在我想找到有配料清单的收据。例如,所有含有“番茄”和“香蒜酱”成分的收据。(而不是只有“西红柿”或“香蒜酱”的收据。查询结果会是什么样子?

试试这个

SELECT * FROM 
(SELECT * FROM ingredients AS i 
LEFT JOIN `receipts-ingredients` AS ri ON i.id=ri.ingredient_id 
LEFT JOIN receipts AS r ON ri.recept_id=r.id 
WHERE i.name='tomato') AS Tomato, JOIN 
(SELECT * FROM ingredients AS i 
LEFT JOIN `receipts-ingredients` AS ri ON i.id=ri.ingredient_id 
LEFT JOIN receipts AS r ON ri.recept_id=r.id 
WHERE i.name='pesto') AS Pesto ON Tomato.recept_id=Pesto.recept_id
SELECT r.id, r.name, GROUP_CONCAT(DISTINCT(i.name)) as items
 FROM receipts r
 LEFT JOIN receipts-ingredients ri ON(ri.receipt_id = r.id)
 LEFT JOIN ingredients i ON(ri.ingredient_id = i.id)
 GROUP BY r.id
 HAVING FIND_IN_SET('tomato',items) AND FIND_IN_SET('pesto',items)

在荷兰董事会上找到了另一个可行的答案:

SELECT
    r.id,
    r.name
FROM
    receipts r
JOIN
    receipts_ingredients ri
    ON r.id = ri.receipt_id
JOIN
    ingredients i
    ON ri.ingredient_id = i.id
WHERE i.name IN ('tomato', 'pesto')
GROUP BY r.id
HAVING COUNT(*) = 2

这是一种硬编码方法(有更好的答案),但您也可以将其用于特定数据(仅供参考:我在“收据成分”表的“收据id”列添加了字符“i”)

编辑

此外,您可能需要在receipts Components表名称周围加上反勾。也许将其重命名为receipts\u Components是个好主意

SELECT aa.id, aa.name AS receipts_name
FROM receipts AS aa
INNER JOIN `receipts-ingredients` AS bb
ON aa.id = bb.receipt_id
INNER JOIN ingredients AS cc
ON cc.id = bb.ingredient_id
INNER JOIN (
    SELECT aa.id
    FROM receipts AS aa
    INNER JOIN `receipts-ingredients` AS bb
    ON aa.id = bb.receipt_id
    INNER JOIN ingredients AS cc
    ON cc.id = bb.ingredient_id
    WHERE cc.name = 'pesto' 
) _aa
ON aa.id = _aa.id
WHERE cc.name = 'tomato'

要么是自连接,要么是分组方式。(学校作业?)这意味着一个子查询?@FrankBee看到QueryTank你了,但是你的查询只给出了“西红柿”或“香蒜酱”的结果。哦,你必须连接两个子查询。editet查询应该非常有效@FrankbeenThank you。它给出了我需要的结果集。比我想象的更复杂。