我正在使用Postgresql.
我有一个有3个字段的桌子
人,食谱和成分
我有一个有3个字段的桌子
人,食谱和成分
person = creator of the recipe recipe = the recipe ingredient = one of the ingredients in the recipe
我想创建一个查询,这个查询导致每个人每次添加胡萝卜到食谱时,该人还必须在同一食谱中添加盐.
不止一个人可以创建配方,在这种情况下,添加成分的人将被记入添加成分.有时,即使是同一个人,该成分也会被使用不止一次.
如果这个表:
person1,rec1,carrot person1,salt person1,rec2,pepper person2,carrot person2,salt person2,pepper person3,sugar person3,carrot
然后我想要这个结果:
PERSON1
因为这个人是唯一一个每次添加胡萝卜也加盐的人.
“胡萝卜只会影响结果.我只想要在他们的食谱中添加至少一根胡萝卜的人,但我不希望那些没有添加盐的人加入他们添加的所有相同食谱中胡萝卜来.抱歉,但我无法解释清楚.“
解决方法
这个怎么样:
SELECT DISTINCT person FROM tableName WHERE ingredient IN('carrot','salt') GROUP BY person,recipe HAVING SUM(CASE WHEN ingredient = 'carrot' THEN 1 ELSE -1 END) <= 0 AND COUNT(DISTINCT ingredient) > 1;
我承认我没有太多使用Postgresql的经验,但查询似乎给出了你在SQL Fiddle中所需的结果(归功于@JohnWoo提供的开始).
我已经更新了答案;在它返回的用户之前,只有他们的一些食谱中的盐作为合法的.第二个HAVING子句过滤掉了这种情况.
更新:上一个查询返回了所有拥有至少一个遵循规则的配方的所有者(“对于每个添加的胡萝卜添加盐也是”).但是你(似乎)实际上需要遵循规则的所有食谱.所以查询看起来像……
SELECT DISTINCT person FROM tableName WHERE person NOT IN ( SELECT person FROM tableName WHERE ingredient IN('carrot','salt') GROUP BY person,recipe HAVING SUM(CASE WHEN ingredient = 'carrot' THEN 1 ELSE -1 END) > 0 );