2016-07-19 12 views
0

Ich habe das folgende Schema:SQL viele zu viele Beziehung wählen

Users 
----- 
id 
name 

Conversations 
------------- 
id 
other 

Partecipants (join table) 
------------ 
id 
user_id 
conversation_id 
other 

Ein Benutzer viele Gespräche haben kann und ein Gespräch gehört zu vielen Benutzern.

Ich muss alle Gespräche eines Benutzers mit einer Teilmenge anderer Benutzer auswählen.

Mein Versuch ist (nicht funktionieren):

SELECT  * 
FROM  `conversations` 
INNER JOIN `participants` ON `conversations`.`id` = `participants`.`conversation_id` 
WHERE  `participants`.`user_id` = 1 
AND   (participants.user_id IN (4,6)) 
GROUP BY participants.conversation_id 

Jede Idee?

+0

Wie kann eine Benutzer-ID für eine "Teilnehmer" Zeile beide gleich 1 und entweder 4 oder 6? Das macht keinen Sinn – Bridge

Antwort

3

Hmmm. Hier ist ein Verfahren unter Verwendung group by und having:

select p.conversation_id 
from participants p 
group by p.conversation_id 
having sum(p.user_id = 1) > 0 and  -- user 1 in conversation 
     sum(p.user_id in (4, 6)) > 0; -- user 4 and/or 6 in conversation 
1

Was ich von Fragen verstehen wurde Sie mögen, dass Benutzer sehen „4,6“ beteiligt im Gespräch mit user_id = 1 zu tun, so versuchen Sie folgende Abfrage.

select * from (SELECT  conversations.id as conversation_id, participants.user_id as selectedUser, GROUP_CONCAT(participants.user_id) AS participants 
FROM  `conversations` 
INNER JOIN `participants` ON `conversations`.`id` = `participants`.`conversation_id` 
GROUP BY participants.conversation_id) as derivedTable 
where 
selectedUser=1 and 
(participants like '%4%' and participants like '%6%') 

enter image description here

was obige Abfrage tut, ist. Zunächst wird der gesamte Datensatz aus der Konversation und der Teilnehmer-Tabelle genommen und alle Teilnehmer werden gegen die Benutzer-ID 1 weitergeleitet. dann äußere Abfrageprüfungen sind ziemlich klar zu finden user_id und die Teilnehmer haben 4 und 6.