修改
人们认为这个问题过于宽泛,所以我在这里缩小范围:
我有一个包含双主键的表:roomID和userID。
以下是一些示例数据:
roomID |用户ID
1 | 5
1 | 9
1 | 10
1 | 12
2 | 5
2 | 9
2 | 10
3 | 5
3 | 17
鉴于用户列表:5,9,10,如何返回仅包含这些用户的roomID?所以在这种情况下它应该返回2。
我希望这可以在1个SQL查询中完成。
任何帮助都会被贬低。
原始问题
我正在制作一个聊天室应用程序,需要为它设计一个数据库后端。所有房间都是动态创建的,当最后一个用户离开房间时会被销毁。用户可以将其他用户添加到他们所在的任何房间。
目前这是我的设计:
我有一个有两列的聊天室表。这两列都是表的主键(因此只有当两列相同时才认为行是重复的)。第一列是房间ID。第二列是用户ID。我在这里的想法是使用相同的房间ID,这个房间里可以有很多用户(所以具有相同房间ID但用户ID不同的行)。当我需要创建一个新房间时,我只需选择MAX(房间ID)+ 1并创建一个带有此ID的新房间并将用户添加到其中。
鉴于用户ID列表(例如1,5,31,12),我需要查明是否已为他们创建了房间。换句话说,我需要确定是否所有具有相同房间ID的行具有用户ID 1,5,31,12。但是,如果使用用户1,5,31,12,6(一个或多个额外用户)创建房间,则不应将其视为已创建的房间。然后我需要为他们创建一个新房间并将用户添加到该房间。对于比列表更少的用户也是如此。
现在我无法形成查询以确定是否需要创建新房间,如果没有,则检索现有房间的房间ID。
任何帮助都将不胜感激。
另外,我认为这个设计非常麻烦,欢迎您建议更好的数据库设计。
P.S。我使用的数据库是MySQL
答案 0 :(得分:0)
我认为yoy可以在聊天室表中添加1个col,名称为num_member,这是房间中的成员数(或者更好的有room(room_id,number_member)表)。为了简单起见,我假设你在聊天室中有num_member。此查询可能有效:
Select * From chatroom where user_id IN ($userIdList) Group by room_id HAVING count(*) = chatroom.num_member
希望这个帮助