Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Sql 复杂条件下的多对多选择_Sql_Select_Many To Many - Fatal编程技术网

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秒)