/ / Mysql znajduje wiersze równe niektórym wartościom, ale ograniczone przez liczbę - mysql, sql

Mysql znajduje wiersze równe niektórym wartościom, ale jest ograniczone przez count - mysql, sql

Mam aplikację do rozmowy, w której użytkownicy są przypisani do rozmów. Jedna rozmowa może mieć 1, 2 lub więcej uczestników, używam tabeli do łączenia użytkowników z rozmowami:

wprowadź opis obrazu tutaj

Gdy użytkownik 5 chce zainicjować nową rozmowę z użytkownikiem 6, nie chcę tworzyć nowej rozmowy, ponieważ użytkownicy 5 i 6 mają już trwający id_ konwersacji.

Mają też inną rozmowę grupową z użytkownikiem 10

Mam 2 parametry: to jest użytkownik 5 który chce rozmawiać użytkownik 6 Jak mogę wysłać zapytanie do tej tabeli, aby sprawdzić, czy istnieje konwersacja tylko między tymi 2 użytkownikami?

Próbowałem tego:

SELECT *,count(id) FROM `conversation_members`
WHERE user_id IN (5,6)
GROUP BY `conversation_id`

wprowadź opis obrazu tutaj

Ale

  • Zwraca to również konwersację id 2, podczas gdy jachciałbym mieć tylko id 1, więc chciałbym ograniczyć wybrane zapytanie do elementów mając liczbę 2, Jeśli wykonam grupę przed utratą umiejętności dopasować użytkowników.
  • Zwraca to także id 7, ponieważ odpowiada 1 z 2 identyfikatorów użytkowników powinno pasować do obu

Na koniec chcę tylko odzyskać ID 1, ponieważ to jest rozmowa włącznie z użytkownik 5 i 6 oraz nikt więcej. Czy jest to możliwe tylko przy użyciu zapytania Mysql?

Odpowiedzi:

2 dla odpowiedzi № 1

Możesz to zrobić:

SELECT conversation_id
FROM conversation_members
GROUP BY conversation_id
HAVING SUM(user_id IN (5, 6)) = 2 AND
COUNT(*) = 2;

Spowoduje to zwrócenie wszystkich rozmów (jeśli są), które mają dokładnie tych członków.


0 dla odpowiedzi nr 2

Użyj sumy wyrażenia wielkości liter wraz z liczbą w klauzuli have:

SELECT conversation_id
FROM conversation_members
GROUP BY conversation_id
HAVING SUM(case when user_id IN (5, 6) then 1 end) = 2
AND COUNT(*) = 2;

Możliwość korzystania z tego HAVING SUM(user_id IN (5, 6)) = 2 nie jest powszechne i wierzę, że jest „ciekawostką MySQL”. Sugeruję więc, abyś zamiast tego użył wyrażenia, które według mnie jest łatwiejsze do odczytania / zrozumienia.