微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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玩.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐