我的应用程序中有一个简单的聊天功能,注册用户可以与其他用户创建聊天组。为了存储用户是聊天成员的信息,我使用了一个简单的关系表:
CREATE TABLE `Chat_Users` (
`ID_Chat` int(11) NOT NULL,
`ID_User` int(11) NOT NULL,
PRIMARY KEY (`ID_Chat`,`ID_User`),
KEY `ID_User` (`ID_User`),
CONSTRAINT `Chat_Users_ibfk_1` FOREIGN KEY (`ID_Chat`) REFERENCES `Chats` (`ID`),
CONSTRAINT `Chat_Users_ibfk_2` FOREIGN KEY (`ID_User`) REFERENCES `Users` (`ID`)
)想象一个组聊天(id: 1 )中有三个用户(id: 1、2、3),另一个组聊天(id: 2)中有三个其他朋友(id: 3、4、5)。那么这个关系表看起来应该是:
Chat_ID | Chat_User
-------------------
1 | 1
1 | 2
1 | 3
2 | 3
2 | 4
2 | 5为了避免具有完全相同用户的多个聊天组,我希望在用户尝试创建新的聊天组时检查是否已经存在相同的聊天组。在创建时,我有一个包含新聊天用户I的字符串列表。因此,我必须检查是否已经有与完全相同的用户if聊天,但不幸的是,我不知道一个‘好’的方式来做到这一点。到目前为止我唯一的想法是
SELECT GROUP_CONCAT(`ID_User`) FROM `Chat_Users`
GROUP BY `ID_Chat`然后使用php对结果进行迭代,并检查其中一个值等于上面的userID列表。如果没有匹配,我知道到目前为止还没有聊天,但是一旦表变大,这种方式当然效率很低。
任何帮助都将不胜感激。
发布于 2021-01-11 14:02:09
一个简单的方法是使用聚合:
select id_chat
from chat_users cu
group by id_chat
having group_concat(cu.id_user order by cu.id_user) = '1,2,3';注意,字符串需要按顺序包含所有三个成员。
您还可以将此表示为:
having sum( cu.id_user in (1, 2, 3) ) = count(*) and
count(*) = 3 -- number of users https://stackoverflow.com/questions/65668273
复制相似问题