0

好的,我正在建立一个多用户聊天系统。

我有一个消息表,其中包含所有消息 - 简化:

messages:

id,
content,
thread_id

然后我有一个线程表:

messages_threads:

id,
participantlist_id

然后我有一个参与者列表:

participantlist:

list_id,
name

我有一个参与者列表链接表:

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 的聊天我得到的结果三行,但我只想要只有用户 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 回答