2015-12-14 11 views
6

że dwie tabele zwane conversations i users są związane ze stołem obrotowym conversation_user który zawiera user_id i kolumnę conversation_id.Znalezienie jeden rząd z tabeli przegubu

| conversation_id | user_id | 
|-----------------|---------| 
|    1 |  1 | 
|    1 |  2 | 
|    2 |  1 | 
|    2 |  2 | 
|    2 |  3 | 

Chcę wysłać bazę danych niektórych identyfikatorów użytkowników i odzyskać rozmowę, w której są razem.

Na przykład:

Kiedy wysłać 1 i 2 muszę otrzymać conversation_id 1, kiedy wysłać 1, 2 i 3 muszę otrzymać conversation_id 2.

Jak mogę napisać takie zapytanie?

Odpowiedz

3

Można użyć GROUP BY i HAVING:

SELECT conversation_id 
FROM tab      -- subquery/temp table/whatever 
GROUP BY conversation_id 
HAVING SUM(user_id = 1) > 0 
    AND SUM(user_id = 2) > 0 
    AND SUM(user_id = 3) > 0 
    AND SUM(user_id NOT IN (1,2,3)) = 0 

SqlFiddleDemo

na 1 i 2:

SELECT conversation_id 
FROM tab 
GROUP BY conversation_id 
HAVING SUM(user_id = 1) > 0 
    AND SUM(user_id = 2) > 0 
    AND SUM(user_id NOT IN (1,2)) = 0 
+1

** Dziękuję bardzo! ** –

0

GROUP_CONCAT może być używany do pobierania wyników jak na swoje wymagania . Możesz zmienić warunki klauzuli mającego uprawnienia: spróbuj to daj mi znać

SELECT conversion_id 
FROM (
    SELECT 
    conversion_id, 
    group_concat(user_id, ',') 
    FROM conversions 
    HAVING group_concat(user_id, ',') = '1,2,3' 
    GROUP BY conversion_id 
) 
+0

zadziałało :) dziękuję –

Powiązane problemy