0

わかりました、マルチユーザー チャット システムをセットアップしています。

私はすべてのメッセージを保持するメッセージテーブルを持っています-簡略化:

messages:

id,
content,
thread_id

それから私はスレッドテーブルを持っています:

messages_threads:

id,
participantlist_id

それから私は参加者リストテーブルを持っています:

participantlist:

list_id,
name

そして私はparticipantlist_linksテーブルを持っています:

participantlist_links:

list_id,
participant_id

参加者のリスト (配列) からスレッド 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."'";
}

しかし今:私はユーザー1と2の間のチャットのthread_idを探しています-ユーザー1、2、3とのマルチユーザーチャットとユーザー1、2、3、4とのチャットがあります3 つの行ですが、ユーザー 1 と 2 のみが参加者である行のみが必要です。

それを照会する方法はありますか?

4

1 に答える 1

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)
于 2012-06-08T18:28:58.700 に答える