2012-06-08 3 views
0

хорошо, я настраиваю многопользовательскую чат-систему.отчаянный со сложным запросом соединения (mysql & php)

я есть таблица сообщений, который содержит все сообщения - упрощено:

messages: 

id, 
content, 
thread_id 

, то у меня есть резьба таблица:

messages_threads: 

id, 
participantlist_id 

то у меня есть participantlist таблица:

participantlist: 

list_id, 
name 

и у меня есть таблица userslist_links:

participantlist_links: 

list_id, 
participant_id 

теперь я хотел бы узнать идентификатор потока из списка (массива) участников, я пришел с этим:

$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."'"; 
} 

но теперь: я смотрю на thread_id из чат между пользователями 1 и 2 - есть многопользовательский чат с пользователями 1,2,3 и чат с пользователями 1,2,3,4. Я получаю результат из трех строк, но мне нужен только тот, где только пользователи 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

, который работает! благодаря! –

Смежные вопросы