gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:57:52 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com