SQL:如何检查表中是否已经存在一组行



我的应用程序中有一个简单的聊天功能,注册用户可以在其中与其他用户创建聊天组。为了存储信息,哪个用户是聊天的成员,我使用了一个简单的关系表:

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

为了避免多个用户完全相同的聊天组,当用户尝试创建一个新的聊天组时,我想检查是否已经存在相同的聊天群。我有一个字符串列表,其中包含创建时新聊天的用户ID。所以我必须检查是否已经有一个用户ID完全相同的聊天,但不幸的是,我不知道一个"好"的方法。到目前为止,我唯一的想法是类似的东西

SELECT GROUP_CONCAT(`ID_User`) FROM `Chat_Users`
GROUP BY `ID_Chat`

然后用php对结果进行迭代,检查是否有一个值等于上面的userIDs列表。如果没有比赛,我知道到目前为止还没有聊天,但一旦桌子变大,这种方式当然效率很低。

任何帮助都将不胜感激。

一个简单的方法是使用聚合:

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 

最新更新