如何比较一列的值? SQL(Postgres)

How to compare the values of one column? SQL(Postgres)

Postgres

我有 table user_answers:

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

我想得到 user_id,只有 user_id 其中 answer_id = 121 和 answer_id = 125。

好成绩:47和52 因为: user_id = 49有121,没有125

这个简单的查询不起作用(returns 没有):

SELECT user_id FROM user_answers
WHERE answer_id = 121 AND answer_id = 125
select user_id
from user_answers
where answer_id in (121, 125)
group by user_id
having count(*) = 2

您的查询 return 没有任何内容,因为 answer_id 在任何给定行上只有一个值。行中不能有多个值。

这是一个集内集查询的例子。我建议使用 group byhaving。这是一种方法:

SELECT user_id
FROM user_answers
WHERE answer_id IN (121, 125)
GROPU BY user_id
HAVING COUNT(DISTINCT answer_id) = 2;

这将 return 具有 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;

你需要 Or,而不是 And。

SELECT user_id FROM user_answers WHERE (answer_id = 121 OR answer_id = 125)

您的原始查询正在查找 answer_id 同时为 121 和 125 的结果。使用 OR 查找 answer_id 是任一值的结果。