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