2017-04-15 3 views
0

Was ich brauche, scheint irgendwie kompliziert, aber dann bin ich nicht so gut in SQL. Im Grunde habe ich eine Tabelle, die Konversationsteilnehmer speichert. Ich brauche eine Abfrage, die unter Verwendung von zwei bereitgestellten Benutzer-IDs bestimmt, ob eine Konversation existiert, die NUR die zwei angegebenen Benutzer enthält. Gespräche, die über diese beiden hinaus zusätzliche Benutzer enthalten, sollten nicht gezählt werden - nur eine einzige 1-zu-1-Konversation zwischen den beiden angegebenen Benutzern.SQL: Wählen Sie genau zwei Zeilen mit einer übereinstimmenden ID basierend auf zwei gegebenen Werten

Hier ist meine SQLfiddle: http://sqlfiddle.com/#!9/284e1/33/0

Und Abfrage meine in-progress, die nicht den Trick tut:

SELECT * FROM mybb_conversation_participants WHERE conversation_id IN ( SELECT conversation_id FROM mybb_conversation_participants WHERE (user_id = 6 OR user_id = 11) GROUP BY conversation_id HAVING COUNT(*) = 2 );

Ich glaube nicht, daß ich das Verständnis der HAVING COUNT(*) = 2 Teil, weil diese Abfrage alle Konversationen zurückgibt, die die zwei Benutzer enthalten, auch wenn andere Benutzer in dieser Konversation ebenfalls vorhanden sind. Wiederum sollten nur 1-zu-1-Konversationen zwischen den beiden bereitgestellten Benutzern ausgewählt werden, andernfalls sollte die Abfrage nichts auswählen. In der obigen SQLFiddle sollten beispielsweise nur Zeilen mit einer conversation_id von 12 oder 19 zurückgegeben werden, da alle anderen Übereinstimmungen mehr als zwei Zeilen enthalten.

Das war, was ich die HAVING Anweisung hoffen wollte, aber anscheinend nicht.

Irgendwelche Ideen?

Antwort

1

Sie können dies tun, mit group by und having:

SELECT conversation_id 
FROM mybb_conversation_participants 
GROUP BY conversation_id 
HAVING SUM((user_id NOT IN (6, 11)) = 0; 

Was ist dies zu tun? Es aggregiert nach der Konversations-ID. Dann wird für jede Konversation gezählt, wie oft ein Benutzer nicht einer der beiden ist. Es akzeptiert Gespräche, wo das wahr ist.

Wenn Sie Positivität bevorzugen, könnte dies leichter zu folgen:

HAVING SUM((user_id IN (6, 11)) = COUNT(*) 

, die sagt, dass alle Benutzer auf das Gespräch für mit denen bilanziert werden Sie gewählt haben.

Schließlich, wenn Sie sicher sein wollen, dass beide (alle) sind beteiligt: ​​

HAVING SUM((user_id IN (6, 11)) = COUNT(*) AND 
     COUNT(DISTINCT user_id) = 2 
+0

Sorry, bemerkte ich, bevor ich Ihre Bearbeitungen sah. Das ist perfekt, vielen Dank für die schnelle Antwort! –

Verwandte Themen