Получение определенного GroupId на основе UserId - PullRequest
0 голосов
/ 05 января 2019

Вот сценарий, в котором мы хотим получить конкретный идентификатор группы. Например, 6, имеющие только 3 пользователя, говорят, что UserId с 2, 1, 3 с этой конкретной группой

Это запрос, который я пытался выполнить

SELECT group_id FROM group_users WHERE group_id IN(SELECT group_id FROM group_users GROUP BY group_id HAVING COUNT(*)=3) AND userid IN (1, 2, 3);

SQL Fiddle DEMO

Ниже приведены подробности из вышеприведенного запроса, которые были разбиты на части

SELECT group_id FROM group_users GROUP BY group_id HAVING COUNT(*)=3

group_id
5
6

SELECT group_id FROM group_users WHERE group_id IN(SELECT group_id FROM group_users GROUP BY group_id HAVING COUNT(*)=3)

group_id
5
5
5
6
6
6

SELECT group_id FROM group_users WHERE group_id IN(SELECT group_id FROM group_users GROUP BY group_id HAVING COUNT(*)=3) AND userid IN (1, 2, 3)

group_id
5
5
6
6
6

SELECT group_id FROM group_users WHERE group_id IN(SELECT group_id FROM group_users GROUP BY group_id HAVING COUNT(*)=3) AND userid=1 AND userid=2 and userid = 3

group_id
NULL

Ожидаемый результат:

group_id
6

Поскольку существует только одна группа с group_id = 6, имеющая 3 пользователей с уникальным userid = 1, 2, 3

Так что group_id = 6 должен быть получен в конечном результате!

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Использовать условный подсчет в предложении HAVING. В MySQL вы можете просто суммировать выполненные условия, потому что true = 1 и false = 0 в MySQL.

SELECT group_id
FROM group_users 
GROUP BY group_id 
HAVING SUM(userid IN (1, 2, 3)) = 3
   AND SUM(userid NOT IN (1, 2, 3)) = 0;

Другой, еще более простой вариант - объединить идентификаторы пользователя и проверить строку:

HAVING GROUP_CONCAT(userid ORDER BY userid) = '1,2,3';
0 голосов
/ 05 января 2019

Итак, вы правы. Вы должны пересекать группы с ровно 3 пользователями с группами, которые содержат минимум 3 пользователей (1,2,3).

Мария ДБ 10.2 года,

SELECT group_id FROM group_users 
GROUP BY group_id 
HAVING COUNT(*)=3
INTERSECT
SELECT group_id FROM group_users 
WHERE userid IN (1, 2, 3)
GROUP BY group_id 
HAVING COUNT(*)=3

Нажмите здесь

Для MySQL 5.6,

SELECT DISTINCT a.group_id FROM
(SELECT group_id FROM group_users 
GROUP BY group_id 
HAVING COUNT(*)=3) a,
(SELECT group_id FROM group_users 
WHERE userid IN (1, 2, 3)
GROUP BY group_id 
HAVING COUNT(*)=3) b
WHERE a.group_id=b.group_id

Нажмите здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...