Mysql SQL:选择表A中的行,其中表B中的行数等于x

Mysql SQL:选择表A中的行,其中表B中的行数等于x,mysql,sql,database,Mysql,Sql,Database,我有两个用于聊天应用程序的简单表(mySQL数据库)。第一个是“Chats”,其中存储了诸如标题之类的元数据,第二个是“Chat_Users”,其中存储了关于哪个用户是哪个Chat的成员的信息。此表类似于以下示例: 现在我必须选择聊天室的ID,其中正好有2个用户。我原以为这没什么大不了的,但不幸的是,我正在努力完成这项任务。我已经尝试过的是计算“Chat_Users”中的行数,然后只选择该数字等于2的行: SELECT * FROM Chats JOIN Chat_Users

我有两个用于聊天应用程序的简单表(mySQL数据库)。第一个是“Chats”,其中存储了诸如标题之类的元数据,第二个是“Chat_Users”,其中存储了关于哪个用户是哪个Chat的成员的信息。此表类似于以下示例:

现在我必须选择聊天室的ID,其中正好有2个用户。我原以为这没什么大不了的,但不幸的是,我正在努力完成这项任务。我已经尝试过的是计算“Chat_Users”中的行数,然后只选择该数字等于2的行:

SELECT * 
  FROM Chats
  JOIN Chat_Users 
    on Chat_Users.ID_Chat = Chats.ID 
 WHERE Chat_Users.ID_User = 200001
 GROUP 
    BY Chat_Users.ID_Chat
     , Chat_Users.ID_User
 HAVING COUNT(Chat_Users.ID_Chat) = 2
在本例中,查询使用来自ID为200001的用户的请求,预期结果是返回ID为1和5的“Chat”行中的所有内容。聊天室4有四个成员,因此不应选择它

上面查询的实际结果是空的(空响应),但我不明白为什么它不起作用。好像
COUNT(Chat\u Users.ID\u Chat)
始终等于1,而不是特定聊天中的实际用户


任何帮助都将不胜感激。

如果您想要两个用户,那么:

select chat_id
from chat_users
group by chat_id
having count(*) = 2;
如果希望其中一个用户是
200001
,请使用
having
子句:

select chat_id
from chat_users
group by chat_id
having count(*) = 2 and
       max(user_id = 200001) > 0;

按照分组方式,您只能得到1的计数

更改为:

SELECT * FROM Chats
INNER JOIN Chat_Users on Chat_Users.ID_Chat = Chats.ID 
WHERE Chat_Users.ID_User = 200001
GROUP BY Chat_Users.ID_User
HAVING COUNT(Chat_Users.ID_Chat) = 2

谢谢你的回答。不幸的是,我已经尝试过了,但没有成功,因为它抛出了一个“SELECT list不在GROUP BY子句中,并且包含未聚合列”错误。您可能需要在该组中列出Chats表中的字段。是的,我也这么认为,但随后您在上面的问题中发布了一个查询,结果为空。不过没关系,第二个答案看起来很好:-)非常感谢你的回答。您提供的第二种方法似乎有效,但我不理解其中的max()函数。为什么需要它?@Flexl。它本质上是在做一个聚合布尔或。如果条件的计算结果为true,则返回“1”。