Php MySQL多对多过滤器
我对以下表格进行了多对多分析: 1) 收据 2) 配料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
-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。它给出了我需要的结果集。比我想象的更复杂。