MYSQL Select 多个用户 id 的消息线程 id

MYSQL Select message thread id by multiple user ids

我正在组装一个线程化的消息传递服务,我正在努力解决一个特定的查询问题。我目前正在尝试创建一个过程,当提供 user_ids 数组时,该过程将 return thread_id。

table 中只有两列:thread_id 和 user_id。 我在 table 中有 4 行用于测试:

INSERT INTO thread_users (`thread_id`, `user_id`) VALUES (1,1);
INSERT INTO thread_users (`thread_id`, `user_id`) VALUES (1,70);
INSERT INTO thread_users (`thread_id`, `user_id`) VALUES (2,1);
INSERT INTO thread_users (`thread_id`, `user_id`) VALUES (2,21);

此示例用户 1 向用户 70 发送消息以启动第一个线程,然后向用户 21 发送消息以启动线程 2;

因为我已经有了两个用户的 ID,所以我想推导的是根据线程的用户列表 "subscribed" 找到 thread_id。

SELECT participants.*
FROM (
    SELECT DISTINCT `thread_id`
    FROM `thread_users` 
    WHERE `thread_users`.`user_id` IN (1, 21)
    GROUP BY `thread_id`
) AS participants

虽然我不想将其包含在这个问题中,但将通过几个连接请求更多数据...因此,话虽如此,让我们将查询缩短为:

SELECT DISTINCT `thread_id`
FROM `thread_participants` 
WHERE `thread_participants`.`user_id` IN (1, 21)
GROUP BY `thread_id`

其中应return 2.

我认识到如果有 2 个用户关联到一个线程或 20 个,则此查询应该 return 正确 thread_id 枯萎。 任何帮助将不胜感激:-) 谢谢!

如果您只是想让 thread_id 的所有参与者都具有 user_id 1 和 21

SELECT participants.user_id
FROM thread_users as participants
INNER JOIN thread_users as my_people
ON my_people.thread_id = participants.thread_id
WHERE my_people.user_id IN (1,21)

如果您想要吸引 thread_id 的用户,请确保他们都是话题的参与者。然后试试这个查询

SELECT participants.thread_id,COUNT(DISTINCT participants.user_id) as participants
FROM thread_users as participants
WHERE participants.user_id IN (1,21)
GROUP BY participants.thread_id
HAVING COUNT(DISTINCT participants.user_id)=2

最后一行只是确保你的 COUNT of DISTINCT user_id 等于 2,这意味着你的 2 user_id of 1 and 21... 如果您想查找用户 (1,21,70) 的线程,您可以将 (1,21) 替换为 (1,21,70) 并将该底线更改为 HAVING COUNT(DISTINCT participants.user_id)=3 然后它将 return 有这 3 个人作为参与者的线程。