MYSQL由多个用户ID选择消息线程ID

时间:2016-04-26 20:40:18

标签: mysql multiple-columns

我正在整理一个线程消息传递服务,我试图围绕一个特定的查询。我目前正在尝试创建一个过程,它将在提供user_ids数组时返回thread_id。

表中只有两列:thread_id&用户身份。 我在表格中有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,我想要派生的是根据“订阅”线程的用户列表找到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`

其中应返回2.

我认识到如果有2个用户与某个线程关联或20个,则此查询应返回正确的thread_id。 任何帮助将非常感谢:-)谢谢!

1 个答案:

答案 0 :(得分:1)

如果你只是想让一个拥有user_id 1和21的thread_id的所有参与者

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

最后一行只是确保你的COID为DISTINCT user_id等于2,这意味着你的2 user_id为1和21 ... 如果你想找到用户的线程(1,21,70)你将(1,21)替换为(1,21,70)并将该底线更改为HAVING COUNT(DISTINCT participants.user_id)=3那么它将返回将这3人作为参与者的主题。