【问题标题】:Find conversation between one or more users查找一位或多位用户之间的对话
【发布时间】:2012-10-16 14:55:10
【问题描述】:

我在查找给定 user_id 之间的对话时遇到问题。

SQL 表:

+-------------------+
| conversation_user |
+-------------------+
| conversation_id   |
| user_id           |
+-------------------+

我试过了

SELECT `conversation_id` FROM `conversation_user` WHERE `user_id` IN (X, Y) HAVING COUNT(*) = N

但它不能正常工作。知道如何选择正确的 conversation_id 吗?对话可以在一个或多个用户之间进行。

编辑:

+-----------------+---------+
| conversation_id | user_id |
+-----------------+---------+
|               1 |       1 | 
|               1 |       2 | 
+-----------------+---------+
|               2 |       1 | 
|               2 |       3 | 
+-----------------+---------+
|               3 |       1 | 
+-----------------+---------+
|               4 |       1 | 
|               4 |       2 | 
|               4 |       3 | 
+-----------------+---------+

假设我想获取用户 1 和 2 之间的对话。结果必须是 1,而不是 1 和 4 或 4。

【问题讨论】:

  • @Tomtom 说了什么或者可能有 count(conversation_id) > 1

标签: mysql sql


【解决方案1】:

我认为你缺少GROUP BY 子句

罢工>

SELECT `conversation_id` 
FROM `conversation_user` 
WHERE `user_id` IN (X, Y) 
GROUP BY conversation_id
HAVING COUNT(DISTINCT user_id) = N

SELECT `conversation_id` 
FROM `conversation_user` a
WHERE `user_id` IN (X, Y) 
GROUP BY conversation_id
HAVING COUNT(DISTINCT user_id) = 
    (
        SELECT COUNT(DISTINCT userid)
        FROM `conversation_user` b
        WHERE b.`conversation_id` = a.`conversation_id`
        GROUP BY b.`conversation_id`
    )

SQLFiddle Demo

【讨论】:

  • 这些查询不返回一个值,它还包括这些用户和其他人参与的位置
  • @Kaspar 它会生成你想要的结果,检查上面的小提琴。小提琴包含 4 个 conversation_id 但 ID=2 将被返回。
  • 正如您在我的示例中看到的那样,当一个用户与自己对话时它会失败。 sqlfiddle.com/#!2/8e17f/2/0我也已经发布了可行的解决方案。
【解决方案2】:

已更新!我解决了这个查询的问题。

SELECT cu.`conversation_id` 
FROM `conversation_user` cu 
INNER JOIN (
    SELECT `conversation_id`
    FROM `conversation_user` 
    WHERE `user_id` IN (X, Y) 
    GROUP BY `conversation_id` HAVING COUNT(*) = Z 
) cu2 ON cu.conversation_id=cu2.conversation_id
GROUP BY `conversation_id` 
HAVING COUNT(*) = Z;

【讨论】:

    【解决方案3】:
        SELECT `conversation_id`,count(*) Number_of_conversations FROM `conversation_user` 
        WHERE `user_id` IN (X, Y) and 
       `user_id` not in(select `user_id` from `conversation_user` where `user_id` not in(X, Y))
        GROUP BY `conversation_id`
        HAVING COUNT(*) = 2
    

    【讨论】:

    • 此查询还包括包含这些用户的所有对话。我只想要这些只涉及给定用户而不涉及其他人的结果。
    • 我用 1 替换了 X,用 2 替换了 Y,结果仍然得到 1 和 4(2 行)。请看我上面的示例数据。
    猜你喜欢
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2014-03-28
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多