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

时间:2016-08-18 16:07:08

标签: php mysql sql select

我正在处理某种类型的私人对话网站,我正在将对话存储在桌面上(消息存储在另一个桌面上)

这是格式:

  • ID:自动递增
  • 标题:Varchar,代表对话的名称
  • 成员:保存可以访问对话的成员的ID

我的问题是,我存储成员的方式确实非常糟糕。我正在使用user1Id;user2Id;user3Id

尝试获取特定播放器的所有对话时,会出现问题。

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

3 个答案:

答案 0 :(得分:2)

为什么不让会员加入对话桌?在那里你可以存储像这样的成员和对话

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

意思是成员1,2和3是对话1的一部分,成员1和2是对话2

这就是我如何做这样的事情以及它的工作方式。

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

答案 1 :(得分:2)

“正确”,规范化的数据库方式是使另一个表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

答案 2 :(得分:0)

存储的一种方法是使用json数组:将member_ids定义为VARCHAR并存储特权ID,如:

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

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