如何比较一列的值?SQL(Postgres)
博士后 我有表格用户的答案:如何比较一列的值?SQL(Postgres),sql,postgresql,Sql,Postgresql,博士后 我有表格用户的答案: ---------------------------- | id | user_id | answer_id | ---------------------------- | 1 | 47 | 121 | ---------------------------- | 2 | 47 | 125 | ---------------------------- | 3 | 47 | 141 | ---
----------------------------
| id | user_id | answer_id |
----------------------------
| 1 | 47 | 121 |
----------------------------
| 2 | 47 | 125 |
----------------------------
| 3 | 47 | 141 |
----------------------------
| 4 | 49 | 122 |
----------------------------
| 5 | 49 | 121 |
----------------------------
| 6 | 49 | 101 |
----------------------------
| 7 | 52 | 121 |
----------------------------
| 8 | 52 | 125 |
----------------------------
| 9 | 52 | 101 |
----------------------------
| 10 | 67 | 101 |
----------------------------
我想获得用户id,只有用户id,其中答案id=121,答案id=125
好结果:47和52
因为:
用户_id=49有121个,但没有125个
此简单查询不起作用(不返回任何内容):
查询不返回任何内容,因为
answer\u id
在任何给定行上只有一个值。行上不能有多个值
这是集合内集合查询的一个示例。我建议使用groupby
和have
。这里有一种方法:
SELECT user_id
FROM user_answers
WHERE answer_id IN (121, 125)
GROPU BY user_id
HAVING COUNT(DISTINCT answer_id) = 2;
这将返回具有121、125和其他值的值。要仅获取这两个值,请执行以下操作:
SELECT user_id
FROM user_answers
WHERE answer_id IN (121, 125)
GROPU BY user_id
HAVING SUM(CASE wHEN answer_id = 121 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE wHEN answer_id = 125 THEN 1 ELSE 0 END) > 0;
查询不返回任何内容,因为
answer\u id
在任何给定行上只有一个值。行上不能有多个值
这是集合内集合查询的一个示例。我建议使用groupby
和have
。这里有一种方法:
SELECT user_id
FROM user_answers
WHERE answer_id IN (121, 125)
GROPU BY user_id
HAVING COUNT(DISTINCT answer_id) = 2;
这将返回具有121、125和其他值的值。要仅获取这两个值,请执行以下操作:
SELECT user_id
FROM user_answers
WHERE answer_id IN (121, 125)
GROPU BY user_id
HAVING SUM(CASE wHEN answer_id = 121 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE wHEN answer_id = 125 THEN 1 ELSE 0 END) > 0;
你需要或不需要和
SELECT user_id FROM user_answers WHERE (answer_id = 121 OR answer_id = 125)
您最初的查询正在查找答案id同时为121和125的结果。使用或查找答案id为值的结果。您需要或,而不是和
SELECT user_id FROM user_answers WHERE (answer_id = 121 OR answer_id = 125)
您最初的查询正在查找答案id同时为121和125的结果。使用或查找答案id为任意值的结果。我们应该为此类问题设置一个标签。他们定期来basis@a_horse_with_no_name . . . 给你更多的力量。我称之为“集合中的集合”。我不知道还有没有别的名字。谢谢你的解释。我现在明白了。我们应该给这类问题贴上标签。他们定期来basis@a_horse_with_no_name . . . 给你更多的力量。我称之为“集合中的集合”。我不知道还有没有别的名字。谢谢你的解释。我现在明白了。如果有人想知道为什么与公认的解决方案相比,这不是一个完整的解决方案。这将返回任何
用户id
,其中应答id
为121或125。因此,它将返回user\u id
49,这在问题中特别指出是一个坏结果,因为该用户没有两个答案。要修复此问题,必须在用户id
上使用group by
子句。然后,分组依据
允许统计计数(*)
用户id存在的行数。现在剩下的就是用一个子句过滤掉任何用户id
,它的计数少于两次(121和125各一次)。如果有人想知道为什么与公认的解决方案相比,这不是一个完整的解决方案。这将返回任何用户id
,其中应答id
为121或125。因此,它将返回user\u id
49,这在问题中特别指出是一个坏结果,因为该用户没有两个答案。要修复此问题,必须在用户id
上使用group by
子句。然后,分组依据
允许统计计数(*)
用户id
存在的行数。现在只剩下一个子句过滤掉任何计数少于两次的用户id
(121和125各一次)。