2016-04-26 5 views
2

Ich bin ein Thread-Messaging-Dienst zusammen und ich versuche, meinen Kopf eine Runde eine bestimmte Abfrage zu wickeln. Ich versuche gerade, eine Prozedur zu erstellen, die die thread_id zurückgibt, wenn ein Array von user_ids bereitgestellt wird.MYSQL Wählen Sie Nachricht Thread-ID durch mehrere Benutzer-IDs

Es gibt nur zwei Spalten in der Tabelle: thread_id & user_id. Ich habe 4 Zeilen in der Tabelle für den Test:

INSERT INTO thread_users (`thread_id`, `user_id`) VALUES (1,1); 
INSERT INTO thread_users (`thread_id`, `user_id`) VALUES (1,70); 
INSERT INTO thread_users (`thread_id`, `user_id`) VALUES (2,1); 
INSERT INTO thread_users (`thread_id`, `user_id`) VALUES (2,21); 

Diese Beispiele Benutzer 1 messaging 70 Benutzer den ersten Thread zu beginnen und dann 21 Benutzernachrichten Thread zu starten 2;

Da ich bereits die IDs beider Benutzer habe, was ich versuche abzuleiten, finde ich die thread_id basierend auf der Liste der Benutzer, die den Thread "abonniert" haben.

Es wird mehr Daten durch ein paar verbindet fordert sein, obwohl ich möchte nicht, dass es in dieser Frage sind ... Also, mit dieser sagte, lets verkürzen nur die Abfrage:

SELECT DISTINCT `thread_id` 
FROM `thread_participants` 
WHERE `thread_participants`.`user_id` IN (1, 21) 
GROUP BY `thread_id` 

davon sollten zurückkehren 2.

ich erkennen, dass diese Abfrage die richtige zurückgeben sollte thread_id welken, wenn zwei Benutzer dort zu einem Faden oder 20. Jede Hilfe wäre sehr dankbar :-) Sie verbunden ist, danken !

+1

Können Sie ein Beispiel für eine Ausgabe geben, die Sie versuchen zu bekommen? – Tin

+0

(von der ursprünglichen Frage - "Von denen sollte 2. zurückgeben.") Also, Abfrage mit dem Benutzer-ID-Array (1,21) -> 2 -oder- (1, 70) -> 1. es würde eine Zeile zurückgeben und die ausgewählte Spalte wäre thread_id – user3617416

Antwort

1

wenn Sie versuchen, nur alle Teilnehmer eines thread_id zu erhalten, die 1 und 21

SELECT participants.user_id 
FROM thread_users as participants 
INNER JOIN thread_users as my_people 
ON my_people.thread_id = participants.thread_id 
WHERE my_people.user_id IN (1,21) 

user_id hat, wenn Sie versuchen thread_id der Benutzer sicherstellen, dass zu bekommen, dass sie alle Teilnehmer der Faden. versuchen dann diese Abfrage

SELECT participants.thread_id,COUNT(DISTINCT participants.user_id) as participants 
FROM thread_users as participants 
WHERE participants.user_id IN (1,21) 
GROUP BY participants.thread_id 
HAVING COUNT(DISTINCT participants.user_id)=2 

die letzte Zeile macht einfach sicher, dass Ihr Zählt eindeutig User_id gleich 2 ist, was bedeutet, dass Ihre 2 User_id von 1 und 21 ... Wenn Sie Thread von Benutzern finden wollten (1 , 21,70) würden Sie die (1,21) durch (1,21,70) ersetzen und die untere Zeile zu HAVING COUNT(DISTINCT participants.user_id)=3 ändern, dann würde es den Thread zurückgeben, der diese 3 Personen als Teilnehmer hat.

+0

Wunderbar! Danke, Tin Tran! – user3617416

+0

war es die 2. Abfrage, nach der Sie gesucht haben? –

+0

war sicher! Ich habe es wie erwähnt in die Unterabfrage gesteckt und es hat mich an die richtige Stelle gebracht. Vielen Dank! Dies wird morgen für einen sehr produktiven Morgen sorgen. – user3617416