2012-06-08 3 views
0

좋아요, 저는 다중 사용자 채팅 시스템을 설정하고 있습니다.복잡한 가입 쿼리 (mysql & php)가 절실 함

participantlist: 

list_id, 
name 
:

messages_threads: 

id, 
participantlist_id 

그때 나는 participantlist 테이블이 :

messages: 

id, 
content, 
thread_id 

그때 나는 스레드 테이블이 : 단순화 -

나는 모든 메시지를 보관 유지하는 메시지 테이블이

및 participantlist_links 테이블이 있습니다.

$threadid_sqlquery = " 
       SELECT messages_threads.id FROM messages_threads 
       JOIN participantlist_links 
       ON messages_threads.participantlist_id = participantlist_links.list_id"; 

foreach($participants_array as &$participant_id){ 
    $maxid_sqlquery .= " 
     AND participantlist_links.participant_id='".$participant_id."'"; 
} 

하지만 지금은 : 지금

participantlist_links: 

list_id, 
participant_id 

내가 참가자 목록 (배열)의 스레드 ID를 찾으려면, 내가이 함께했다 난의 thread_id을 찾고 있어요 사용자 1과 2 사이의 채팅 - 사용자 1,2,3과 다중 사용자 채팅이 있고 사용자 1,2,3,4와의 채팅이 있습니다. 3 개의 행 결과가 표시되지만, 사용자 1과 2는 참가자입니다.

거기에 대해 쿼리 할 수있는 방법은 무엇입니까?

답변

2
SELECT mt.id 
FROM (
     SELECT list_id 
     FROM participantlist_links pll 
     WHERE participant_id IN (1, 2) 
     GROUP BY 
       list_id 
     HAVING COUNT(*) = 2 
     ) q 
JOIN message_threads mt 
ON  mt.participantlist_id = q.list_id 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM participantlist_links pll 
     WHERE pll.list_id = q.list_id 
       AND pll.participant_id NOT IN (1, 2) 
     ) 

는 다음 인덱스를 만듭니다 작동

participantlist_links (participant_id, list_id) -- unique 
participantlist_links (list_id) 
+0

을! 감사! –