MySQL - 数量的多个唯一/约束

时间:2012-11-06 23:39:50

标签: mysql

我的问题比示例更为笼统,但我认为说明这个想法的唯一方法是使用样本。

假设我想为聊天应用程序创建数据库。将有一个主题列表。任何时候任何“房间”4个用户。

说有一个名为“贝多芬”的话题。如果用户选择该主题,则提取或创建房间。一旦有4个用户加入该房间,就会创建另一个房间实例(同一主题),在创建另一个实例之前最多需要4个用户。如果第一个房间实例中的用户离开,则该插槽已打开,因此加入该主题的第9个用户将被发送到第一个房间实例。

管理此问题的最佳方法是什么?我有两个想法:

  1. “主题”表:id,label
  2. “会议室”表:id,topicId
  3. “人口”表:roomId,userId
  4. 当用户选择/加入主题时,类似SELECT COUNT(userId) FROM Population WHERE topicId = <id> ...如果计数&gt; 4,创建一个新的Room,插入它并返回插入id。当用户离开房间时,人口中的该行将被删除。

    或者...

    1. “主题”表:id,label
    2. “会议室”表:id,topicId,user1,user2,user3,user4。
    3. 然后当用户加入时,如SELECT id FROM Rooms WHERE ISNULL(user1) OR ISNULL(user2) OR ISNULL(user3) OR ISNULL(user4) LIMIT 1

      如果没有匹配的行,请插入一个新的Room并返回插入ID。当用户离开房间时,该列设置为NULL。

      TYIA。

1 个答案:

答案 0 :(得分:0)

我使用了你的第一个架构。

获取非完整房间列表:

SELECT room.id
FROM       topic
INNER JOIN room       ON room.topic_id = topic.id
INNER JOIN population ON population.room_id = room.id
WHERE topic.label = 'purcell'
GROUP BY room.id
HAVING COUNT(*) < 4

获取第一个非完整房间ID,如果没有找到这样的房间,则为NULL:

SELECT MIN( room_id )
FROM (
  SELECT room.id AS room_id
  FROM       topic
  INNER JOIN room       ON room.topic_id = topic.id
  INNER JOIN population ON population.room_id = room.id
  WHERE topic.label = 'purcell'
  GROUP BY room.id
  HAVING COUNT(*) < 4
) AS non_full_rooms