如何比较一列的值?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各一次)。