好的,我正在设置一个多用户聊天系统。
我有一个消息表,其中包含所有消息 - 简化:
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 聊天我得到三行的结果,但我只想要只有用户 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)