1

我在查找给定 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。

4

3 回答 3

2

我认为你缺少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 演示

于 2012-10-16T14:57:21.033 回答
1

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

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;
于 2012-10-16T15:48:50.190 回答
0
    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
于 2012-10-16T14:59:19.903 回答