Sql 复杂条件下的多对多选择
我有以下表格:Sql 复杂条件下的多对多选择,sql,select,many-to-many,Sql,Select,Many To Many,我有以下表格: +------------+ | Ingredient | +------------+ | id | +------------+ | name | +------------+ +---------------+ | Relingredient | +---------------+ | id_ingredient | +---------------+ | id_recipe | +---------------+ +--------
+------------+
| Ingredient |
+------------+
| id |
+------------+
| name |
+------------+
+---------------+
| Relingredient |
+---------------+
| id_ingredient |
+---------------+
| id_recipe |
+---------------+
+--------+
| Recipe |
+--------+
| id |
+--------+
| name |
+--------+
而且我需要选择含有我想要的成分的食谱(所有成分都传递给它们)我尝试了以下方法:
SELECT R.id, R.nom FROM Recipe R, Relingredient RI, Ingredient I
WHERE R.id = RI.id_recipe AND RI.id_ingredient = I.id AND I.name='onion' AND I.name='oil'
GROUP BY R.name
但是返回零行
我也试过:
SELECT R.id, R.nom FROM Recipe R, Relingredient RI, Ingredient I
WHERE R.id = RI.id_recipe AND RI.id_ingredient = I.id AND (I.name='onion' or I.name='oil')
GROUP BY R.name
但它选择了所有含有洋葱或油的食谱,而不仅仅是那些含有洋葱和油的食谱。。。我能做什么?(编辑)我想要的样本:
例如,我有食谱:
1:烤鸡(配料:鸡肉、洋葱、油)
2:中国汤(配料:猪肉、洋葱、油、面条)
3:蔬菜三明治(配料:面包、油、西红柿、沙拉)
查询应该只返回食谱:烤鸡和中国汤
谢谢你帮助我 试试这样的方法:
SELECT
R.id, R.name
FROM Recipt R
JOIN Relingredient RI
ON R.Id = RI.Id_recipe
JOIN Ingredient I
ON RI.Id_ingredient = I.Id
WHERE I.name = 'onion'
OR I.name='oil'
GROUP BY R.id, R.name
HAVING COUNT(I.name) = 2
试试这个:
SELECT R.id, R.name FROM Recipe R
Where R.Id in (
Select RI.Id_recipe From Relingredient as RI
INNER JOIN Ingredient as I ON RI.Id_ingredient = I.Id
WHERE I.name = 'onion'
OR I.name='oil'
)
我完全明白了。
新查询:
SELECT *
FROM dbo.Recipt
WHERE Id IN ( SELECT id_recipe
FROM dbo.Relingredient
INNER JOIN dbo.Ingredient ON id_ingredient = Id
WHERE Name = 'oil' )
AND Id IN ( SELECT id_recipe
FROM dbo.Relingredient
INNER JOIN dbo.Ingredient ON id_ingredient = Id
WHERE Name = 'union' )
要准确获取您想要的成分,请使用
having
子句:
SELECT R.id, R.nom
FROM Recipe R JOIN
Relingredient RI
ON R.id = RI.id_recipe JOIN
Ingredient I
ON RI.id_ingredient = I.id
GROUP BY R.name
HAVING SUM(CASE WHEN I.name = 'onion' THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN I.name = 'oil' THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN I.name NOT IN ('onion', 'oil') THEN 1 ELSE 0 END) = 0;
having
子句中的每个条件检查其中一个条件。第一种检查至少有一种成分是“洋葱”,第二种检查至少有一种成分是“油”,第三种检查没有其他成分。如果你想加入其他成分,请删除最后一条
这种方法对于成分的不同条件非常灵活
编辑:
以下having
子句允许您仅对成分命名一次。但您还需要插入计数:
HAVING COUNT(DISTINCT CASE WHEN I.name IN ('onion', 'oil') THEN I.name END) = COUNT(DISTINCT NAME) AND
COUNT(DISTINCT NAME) = 2;
distinct
是为了防止一个配方可以包含一种成分不止一次。它不起作用,但谢谢,成分可以多于我搜索的成分,我想选择包含我搜索的成分的配方。@user3671561不起作用,这不是问题的解释。具体点。这个查询准确地返回了所有包含洋葱和油的配方。它还向我返回了一个只有油的配方,而不是油+洋葱的配方,先生!我又试了一次,成功了!我不知道上次我是不是抄袭的很差,事实是现在效果很好,我做了很多次测试,看起来效果不错nice@MikeRamos只有在配方中添加两次润滑油时,才可能出现这种情况。如果是选项,您可以使用COUNT(DISTINCT I.Name)而不是。它不起作用,它返回给我含有洋葱或油的食谱,而不是含有这两种成分的食谱,但无论如何,谢谢。您能写一个样本数据来准确解释您想要什么吗?亲爱的迈克,我创建了您的样本,这个答案对您的问题不正确!!!!我的疑问是正确的@哈姆雷特·哈科比扬。本应删除的行。谢谢你。谢谢你的时间,但似乎有些东西不起作用,它返回我:MySQL返回了一个空的结果集(即零行)。(查询耗时0.0028秒)