sql - PostgreSQL - 仅当特定的多个出现在列中时才选择

标签 sql database postgresql select

我正在使用 PostgreSQL。 我有一个包含 3 个字段的表 人物、食谱和配料

person = creator of the recipe
recipe = the recipe
ingredient = one of the ingredients in the recipe

我想创建一个查询,结果是每个人只要在食谱中添加了胡萝卜,这个人就必须在同一食谱中添加盐。

可以有多个人创建该食谱,在这种情况下,添加该成分的人将被记为添加了该成分。有时,这种成分会被多次使用,即使是同一个人。

如果是这个表:

person1, rec1, carrot
person1, rec1, salt
person1, rec1, salt
person1, rec2, salt
person1, rec2, pepper
person2, rec1, carrot
person2, rec1, salt
person2, rec2, carrot
person2, rec2, pepper
person3, rec1, sugar
person3, rec1, carrot

然后我想要这个结果: 人1

因为这个人是唯一一个每次加胡萝卜的时候也加盐的。

“除了胡萝卜,什么都不会影响结果。我只想要那些在他们的食谱中至少添加了一根胡萝卜的人,但我不想要那些没有在他们所有相同的食谱中添加盐的人添加了胡萝卜。抱歉,我无法解释得更清楚。”

最佳答案

这个怎么样:

   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一起玩。

关于sql - PostgreSQL - 仅当特定的多个出现在列中时才选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13163057/

相关文章:

android - 我应该保留远程数据库的本地副本吗?

php - Mysql表显示不正确

postgresql - 是否有任何工具可以将 RDS PostgreSQL 从 AWS 迁移到 Google Cloud SQL?

database - 在具有共享/独占锁的数据库中,当事务开始时执行UPDATE语句时,锁是如何工作的?

java - 如何在Java中通过executeUpdate命令使用Access的Replace()函数?

sql - 如何使用 Oracle SQL 中的 SUM 函数生成以下输出?

SQLite 选择哪里为空?

sql - 允许角色查询、插入和更新可变数组

php - 在数据库中插入 Unicode 字符

postgresql - postgres 中的事务支持什么