MySQL - выберите что-то ТОЛЬКО, где столбцы содержат определенные значения, и ничего больше - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть таблица messages_users, которая содержит пользователей, участвующих в беседе:

conversationId | userId

Поскольку цель состоит в том, чтобы в беседе могли участвовать несколько пользователей, одна строка равна одному пользователю.

Существует два типа разговоров: разговор с другом и групповой разговор с несколькими пользователями.Их отличает только количество людей в нем.

2 пользователя = разговор с другом

3 или более = групповой разговор

Я хочу разрешить пользователям открыватьразговор со своими друзьями по их идентификаторам (здесь, 1 и 2).Итак, мне нужно сделать SQL-оператор, который будет извлекать идентификатор диалога ТОЛЬКО, где находятся эти два пользователя.

Если я сделаю это, я получу все разговоры, в которых находятся эти два пользователя (если естьгрупповые разговоры с ними, например)

SELECT convId FROM messages_users WHERE userId IN (1,2)

Я пробовал это, но это не будет работать:

SELECT convId FROM messages_users WHERE userId IN (1,2) HAVING COUNT(userId) = 2

Также пробовал это, но тем не менее он будет получать мне все разговоры, которые онив:

SELECT convId FROM messages_users a INNER JOIN messages_users b ON a.convId = b.convId WHERE a.userId = 1 AND b.userId = 2

Ответы [ 3 ]

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

Мы можем попробовать использовать операцию самостоятельного соединения с предложением EXISTS:

SELECT DISTINCT mu1.convId
FROM messages_users mu1
INNER JOIN messages_users mu2
    ON mu1.convId = mu2.convId
WHERE
    (mu1.userId = 1 AND mu2.userId = 2) AND
    NOT EXISTS (SELECT 1 FROM messages_users mu
                WHERE mu.convId = mu1.convId AND userID NOT IN (1, 2));

Вот ссылка на демонстрационный пример, показывающий, что вышеуказанная логика работает:

Демо

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

Требуемое условие:

SELECT mu.convId
FROM messages_users mu
GROUP BY mu.convId
HAVING SUM(CASE WHEN mu.userId = 1 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN mu.userId = 2 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN mu.userId NOT IN (1, 2) THEN 1 ELSE 0 END) = 0;

Вы не можете отфильтровать до GROUP BY, потому что тогда вы пропустите счет пользователя "3" в разговоре.Третье условие препятствует участию «3».

В MySQL это может быть упрощено до:

SELECT mu.convId
FROM messages_users mu
GROUP BY mu.convId
HAVING SUM( mu.userId = 1 ) > 0 AND
       SUM( mu.userId = 2 ) > 0 AND
       SUM( mu.userId NOT IN (1, 2) ) = 0;
0 голосов
/ 27 декабря 2018

Для каждого " разговора с другом " должно быть только 2 строки с одинаковыми convId:

SELECT convId
FROM messages_users 
GROUP BY convId
HAVING COUNT(userId) = 2;

Если вы хотите " разговоров с другом"для пользователей 1 и 2:

SELECT DISTINCT convId FROM messages_users 
WHERE 
  (userId IN (1, 2)) 
  AND 
  convId IN 
    (SELECT convId
    FROM messages_users 
    GROUP BY convId
    HAVING COUNT(userId) = 2); 

См. demo

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