首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:如何检查表中是否已经存在一组行

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

Stack Overflow用户
提问于 2021-01-11 14:00:21
回答 1查看 140关注 0票数 1

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

代码语言:javascript
复制
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)。那么这个关系表看起来应该是:

代码语言:javascript
复制
Chat_ID | Chat_User
-------------------
1       | 1
1       | 2
1       | 3
2       | 3
2       | 4
2       | 5

为了避免具有完全相同用户的多个聊天组,我希望在用户尝试创建新的聊天组时检查是否已经存在相同的聊天组。在创建时,我有一个包含新聊天用户I的字符串列表。因此,我必须检查是否已经有与完全相同的用户if聊天,但不幸的是,我不知道一个‘好’的方式来做到这一点。到目前为止我唯一的想法是

代码语言:javascript
复制
SELECT GROUP_CONCAT(`ID_User`) FROM `Chat_Users`
GROUP BY `ID_Chat`

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

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-11 14:02:09

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

代码语言:javascript
复制
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';

注意,字符串需要按顺序包含所有三个成员。

您还可以将此表示为:

代码语言:javascript
复制
having sum( cu.id_user in (1, 2, 3) ) = count(*) and
       count(*) = 3  -- number of users 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65668273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档