查找一列中具有相同值而另一列中具有其他值的行?

射线

我有一个PostgreSQL数据库,该数据库将用户存储在users表中,并将用户参与的对话存储conversation表中。由于每个用户都可以参与多个对话,并且每个对话可以涉及多个用户,因此我有一个conversation_user链接表来跟踪哪些用户正在参与每个对话:

# conversation_user
id  |  conversation_id | user_id
----+------------------+--------
1   |                1 |      32
2   |                1 |       3
3   |                2 |      32
4   |                2 |       3
5   |                2 |       4

在上表中,用户32仅与用户3进行了一次对话,而与3和用户4进行了另一次对话。我如何编写一个查询来显示仅在用户32与用户3之间存在对话?

我尝试了以下方法:

SELECT conversation_id AS cid,
       user_id
FROM conversation_user
GROUP BY cid HAVING count(*) = 2
AND (user_id = 32
     OR user_id = 3);

SELECT conversation_id AS cid,
   user_id
FROM conversation_user
GROUP BY (cid HAVING count(*) = 2
AND (user_id = 32
     OR user_id = 3));

SELECT conversation_id AS cid,
       user_id
FROM conversation_user
WHERE (user_id = 32)
  OR (user_id = 3)
GROUP BY cid HAVING count(*) = 2;

这些查询会引发错误,指出user_id必须出现在GROUP BY子句中或在聚合函数中使用。将它们放在聚合函数中(例如MINMAX)听起来不合适。我以为我的前两次尝试是将它们放在GROUP BY子句中。

我究竟做错了什么?

欧文·布兰德斯特

这是关系分裂的情况在这个相关的问题下,我们组建了一个技术库:

特殊的困难是排除其他用户。基本上有4种技术。

我建议LEFT JOIN/ IS NULL

SELECT cu1.conversation_id
FROM        conversation_user cu1
JOIN        conversation_user cu2 USING (conversation_id)
LEFT   JOIN conversation_user cu3 ON cu3.conversation_id = cu1.conversation_id
                                 AND cu3.user_id NOT IN (3,32)
WHERE  cu1.user_id = 32
AND    cu2.user_id = 3
AND    cu3.conversation_id IS NULL;

NOT EXISTS

SELECT cu1.conversation_id
FROM   conversation_user cu1
JOIN   conversation_user cu2 USING (conversation_id)
WHERE  cu1.user_id = 32
AND    cu2.user_id = 3
AND NOT EXISTS (
   SELECT 1
   FROM   conversation_user cu3
   WHERE  cu3.conversation_id = cu1.conversation_id
   AND    cu3.user_id NOT IN (3,32)
   );

这两个查询都不依赖于的UNIQUE约束(conversation_id, user_id)约束可能存在也可能没有。这意味着,即使user_id对于同一会话多次列出32(或3),该查询甚至仍然有效不过,您在结果中得到重复的行,并且需要应用DISTINCTGROUP BY
唯一的条件是您制定的条件:

...一个查询,表明仅用户32和用户3之间存在对话?

审计查询

您在评论中链接查询不起作用。您忘记了排除其他参与者。应该是这样的:

SELECT *  -- or whatever you want to return
FROM   conversation_user cu1
WHERE  cu1.user_id = 32
AND    EXISTS (
   SELECT 1
   FROM   conversation_user cu2
   WHERE  cu2.conversation_id = cu1.conversation_id 
   AND    cu2.user_id = 3
   )
AND NOT EXISTS (
   SELECT 1
   FROM   conversation_user cu3
   WHERE  cu3.conversation_id = cu1.conversation_id
   AND    cu3.user_id NOT IN (3,32)
   );

与其他两个查询类似,不同之处在于如果user_id = 3多次链接,它将不会返回多行

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在多行的一列中查找具有相同值的行,而另一列具有不同的值

来自分类Dev

选择在一列中具有相同值而在另一列中具有不同值的行

来自分类Dev

查找另一列中具有相同值的行-Python

来自分类Dev

SQL / Postgres:查找具有相同值的元组(对于另一列中的给定值)

来自分类Dev

在python中与另一列具有相同值的行中选择具有最高列值的csv行

来自分类Dev

删除一列中具有重复值但其他列中具有不同值的行

来自分类Dev

删除一列中具有重复值但其他列中具有不同值的行

来自分类Dev

删除一列中具有重复值但另一列中具有不同值的行

来自分类Dev

如何在一列中获得具有最小值的行,并按另一列分组,同时保留其他列?

来自分类Dev

如何在一列中获取具有最小值的行,并按另一列进行分组,同时保留其他列?

来自分类Dev

选择另一列中具有相同ID但值不同的行

来自分类Dev

合并多维数组,并对在另一列中具有相同值的列值求和

来自分类Dev

合并多维数组,并对在另一列中具有相同值的列值求和

来自分类Dev

一列中具有相同值的多行

来自分类Dev

如何使一列在其他列中具有唯一值

来自分类Dev

如果另一列具有相同的值,则将列中每一行的数据插入表中

来自分类Dev

选择在列中具有相同值而在另一列中具有不同值的记录

来自分类Dev

如何将一列中的值复制到R中另一列中具有相同值的行?

来自分类Dev

查找与另一个数据框中的列具有相同的非唯一列值的数据框中的行

来自分类Dev

如何提取与某行相同的一列中具有相同值的所有行?

来自分类Dev

从 Pandas Dataframe 中查找列中的唯一值,并查看这些值是否在另一列中具有相同的值

来自分类Dev

合并具有相同值和总和值的同一列和表中的行

来自分类Dev

从表中选择所有行,除了具有相同 id 的另一个表中的行在另一列中具有特定值

来自分类Dev

计算一列在另一列中是否具有特定值

来自分类Dev

用于检查一列中具有相同值的行在另一列中是否具有匹配值的公式

来自分类Dev

如果索引组在另一列中具有相同的值,则过滤DataFrame

来自分类Dev

在具有相同ID pyspark数据框的另一列中显示不同的值

来自分类Dev

熊猫-在另一列中查找哪个ID具有多个对应值

来自分类Dev

如何选择具有在一列中重复但在另一列中具有不同值的列值的行?

Related 相关文章

  1. 1

    在多行的一列中查找具有相同值的行,而另一列具有不同的值

  2. 2

    选择在一列中具有相同值而在另一列中具有不同值的行

  3. 3

    查找另一列中具有相同值的行-Python

  4. 4

    SQL / Postgres:查找具有相同值的元组(对于另一列中的给定值)

  5. 5

    在python中与另一列具有相同值的行中选择具有最高列值的csv行

  6. 6

    删除一列中具有重复值但其他列中具有不同值的行

  7. 7

    删除一列中具有重复值但其他列中具有不同值的行

  8. 8

    删除一列中具有重复值但另一列中具有不同值的行

  9. 9

    如何在一列中获得具有最小值的行,并按另一列分组,同时保留其他列?

  10. 10

    如何在一列中获取具有最小值的行,并按另一列进行分组,同时保留其他列?

  11. 11

    选择另一列中具有相同ID但值不同的行

  12. 12

    合并多维数组,并对在另一列中具有相同值的列值求和

  13. 13

    合并多维数组,并对在另一列中具有相同值的列值求和

  14. 14

    一列中具有相同值的多行

  15. 15

    如何使一列在其他列中具有唯一值

  16. 16

    如果另一列具有相同的值,则将列中每一行的数据插入表中

  17. 17

    选择在列中具有相同值而在另一列中具有不同值的记录

  18. 18

    如何将一列中的值复制到R中另一列中具有相同值的行?

  19. 19

    查找与另一个数据框中的列具有相同的非唯一列值的数据框中的行

  20. 20

    如何提取与某行相同的一列中具有相同值的所有行?

  21. 21

    从 Pandas Dataframe 中查找列中的唯一值,并查看这些值是否在另一列中具有相同的值

  22. 22

    合并具有相同值和总和值的同一列和表中的行

  23. 23

    从表中选择所有行,除了具有相同 id 的另一个表中的行在另一列中具有特定值

  24. 24

    计算一列在另一列中是否具有特定值

  25. 25

    用于检查一列中具有相同值的行在另一列中是否具有匹配值的公式

  26. 26

    如果索引组在另一列中具有相同的值,则过滤DataFrame

  27. 27

    在具有相同ID pyspark数据框的另一列中显示不同的值

  28. 28

    熊猫-在另一列中查找哪个ID具有多个对应值

  29. 29

    如何选择具有在一列中重复但在另一列中具有不同值的列值的行?

热门标签

归档