Как найти точное совпадение строки, используя IN в предложении Where? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть две таблицы tbl_group И tbl_members.Вот снимок обеих таблиц.

+----+------------+
| id | groupTitle |
+----+------------+
|  1 | Group 1    |
|  2 | Group 2    |
+----+------------+

+----+---------+--------+
| id | groupId | userId |
+----+---------+--------+
|  1 |       1 |      1 |
|  2 |       1 |      2 |
|  3 |       1 |      3 |
|  4 |       2 |      1 |
|  5 |       2 |      2 |
+----+---------+--------+

Теперь я хочу создать еще одну группу с userId 3,2, но перед этим я хочу проверить, есть ли какая-либо группа, которая имеет того же члена 3 и 2, но нелюбой другой.

Я использовал предложение IN, но оно не работает.

SELECT DISTINCT groupId 
FROM tbl_members 
WHERE userId IN (3,2)

Возвращает обе группы, хотя результат будет пустым.

Ответы [ 6 ]

0 голосов
/ 20 декабря 2018

Первый внутренний запрос решит, что все выбранные группы имеют только двух членов, что уменьшит набор ненужных записей, затем второй внутренний запрос возьмет этот идентификатор группы и проверит, нет ли другого члена, кроме 3,2 в этой группе, и, наконец, весь запросдаст идентификатор группы, которая имеет только 3,2 члена.

SELECT groupId 
FROM tbl_members m
 WHERE m.userId IN (3,2) AND 
(SELECT COUNT(memberId) FROM tbl_members mmm WHERE mmm.groupId=m.groupId)=2 AND 
(SELECT COUNT(memberId) FROM tbl_members mm WHERE mm.groupId=m.groupId AND 
m.userId NOT IN (3,2))<=0 
GROUP BY groupId
0 голосов
/ 19 декабря 2018

Возвращает идентификатор группы, в которой только 2 И 3 находятся в группе.Количество всех идентификаторов пользователя в группе - сумма 1 для записей, где идентификатор пользователя = 2 или 3 должен быть равен 0, если в группе нет других идентификаторов пользователей.

Конечно, это будет работать, только если 2 и 3 неПовторите в той же группе.

SELECT groupId
FROM tbl_members
GROUP BY groupId
HAVING COUNT(userId)-SUM(userId IN (2,3)) = 0
0 голосов
/ 19 декабря 2018

Одним из способов является использование фильтрации на основе условного агрегирования с использованием GROUP BY с предложением HAVING.Мы будем использовать запрос, чтобы получить значение groupId, которое имеет userId значения только 3 и 2.Если запрос не возвращает такого значения;это означает, что такой группы не существует;следовательно, вы можете создать группу.

SELECT
  groupId
FROM tbl_members 
GROUP BY groupId
HAVING SUM(userId = 2) AND /* userID 2 exists */
       SUM(userId = 3) AND /* userID 3 exists */
       NOT SUM(userId NOT IN (2,3)) /* No other userId exists (other than 2,3) */
0 голосов
/ 19 декабря 2018

Я думаю, что этот запрос даст группу значений в userid (2,3), groupid (2,3) из таблицы

SELECT count(1), userid ,groupid  FROM tbl_members 
WHERE groupid IN (3,2) and userid in (3,2)
group by  userid, groupid;
0 голосов
/ 19 декабря 2018
SELECT DISTINCT groupId FROM tbl_members WHERE userId = '2'
INTERSECT
SELECT DISTINCT groupId FROM tbl_members WHERE userId = '3'
0 голосов
/ 19 декабря 2018

Мы можем попробовать использовать INSERT INTO ... SELECT с предложением EXISTS, в котором утверждается, что userId из 2/3 не встречается ни в одной группе.

INSERT INTO tbl_members (groupId, userId)
SELECT groupId, userId
FROM (
    SELECT 3 AS groupId, 2 AS userId UNION ALL SELECT 3, 3
) t
WHERE NOT EXISTS (SELECT 1 FROM tbl_members
                  WHERE userId IN (2, 3)
                  GROUP BY groupId
                  HAVING MIN(userId) <> MAX(userId));

Вам также необходимо вставитьНовая запись в таблице tbl_group для новой группы.

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