PostgreSQL – 仅在列中的特定多重外观时选择

前端之家收集整理的这篇文章主要介绍了PostgreSQL – 仅在列中的特定多重外观时选择前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Postgresql.
我有一个有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
 );

SQL Fiddle玩.

猜你在找的Postgre SQL相关文章