在字段中选择包含用户id的mysql行


Selecting mysql row containing user id inside a field

我正在开发某种类型的私人对话网站,我正在将对话存储在一个表上(消息存储在另一个表上)

格式:

  • Id:自动递增
  • 标题:Varchar,代表对话的名称
  • Members:保存具有会话访问权限的成员id

我的问题是,我存储成员的方式实际上是可怕的。我用的是user1Id;user2Id;user3Id

当试图获取特定玩家的所有对话时出现问题。

我的问题是:有没有更好的存储id的方法?(如果可能的话,在一个字段上)并且还能够选择特定id的所有对话?

"正确的"、规范化的数据库方式应该是有另一个表member_conversation_map,它有两列——成员ID和会话ID,并使用in操作符来查询它:

SELECT *
FROM   conversations
WHERE  id IN (SELECT conversation_id
              FROM   member_conversation_map
              WHERE  member_id = 123)

如果这不是一个选项,并且您必须在数据库中的单个单元格中拥有成员id,那么至少使用逗号而不是分号作为分隔符。这将允许您使用MySQL的find_in_set:

SELECT *
FROM   conversations
WHERE  FIND_IN_SET('123', members) > 0

为什么不为会话表创建一个成员呢?在这里你可以像这样存储成员和对话

member_id | conversation_id
        1 |               1
        2 |               1
        3 |               1
        1 |               2
        2 |               2

表示成员1、2和3属于会话1,成员1和2属于会话2

我就是这样做的,这样做效果很好。

如果您仍然希望将它们存储在一个字段中,那么您的方式将是最好的,因为您可以通过它们的分隔符将它们分开,并以这种方式将所有id存储在数组中。但正如您所指出的,通过用户id获取对话使用此方法会很快变得混乱。

一种存储方法是使用json数组:定义member_ids到VARCHAR并存储特权id,如:

["11","1","2","3"]

使用json_decode可以在需要时获取成员