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

Php 选择字段中包含用户id的mysql行,php,mysql,sql,select,Php,Mysql,Sql,Select,我正在开发某种类型的私人对话网站,并将对话存储在一个表中。消息存储在另一个表中 这就是格式: Id:自动递增 标题:Varchar,表示对话的名称 成员:保存有权访问对话的成员的ID 我的问题是,我存储成员的方式简直太可怕了。我使用的是user1Id;user2Id;user3Id 当试图获取特定玩家的所有对话时,会出现问题 我的问题是:有没有更好的方法来存储ID?如果可能,在一个字段上,并且能够选择特定id的所有对话?为什么不将成员加入对话表?在那里你可以像这样存储成员和对话 member_i

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

这就是格式:

Id:自动递增 标题:Varchar,表示对话的名称 成员:保存有权访问对话的成员的ID 我的问题是,我存储成员的方式简直太可怕了。我使用的是user1Id;user2Id;user3Id

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


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

为什么不将成员加入对话表?在那里你可以像这样存储成员和对话

member_id | conversation_id
        1 |               1
        2 |               1
        3 |               1
        1 |               2
        2 |               2
意思是成员1、2和3是会话1的一部分,成员1和2是会话2的一部分

我就是这样做的,这样做很好


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

为什么不将成员添加到对话表中?在那里你可以像这样存储成员和对话

member_id | conversation_id
        1 |               1
        2 |               1
        3 |               1
        1 |               2
        2 |               2
意思是成员1、2和3是会话1的一部分,成员1和2是会话2的一部分

我就是这样做的,这样做很好


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

正确、规范化的数据库方法是使用另一个表,即带有两列的member\u conversation\u map(成员id和对话id),并使用in运算符(例如)进行查询:

SELECT *
FROM   conversations
WHERE  id IN (SELECT conversation_id
              FROM   member_conversation_map
              WHERE  member_id = 123)
如果这不是一个选项,并且必须在数据库的单个单元格中包含成员ID,那么至少使用逗号而不是分号作为分隔符。这将允许您使用MySQL的:


正确的、规范化的数据库方法是使用另一个表,即带有两列的member_conversation_映射,即member ID和conversation ID,并使用in运算符(例如)进行查询:

SELECT *
FROM   conversations
WHERE  id IN (SELECT conversation_id
              FROM   member_conversation_map
              WHERE  member_id = 123)
如果这不是一个选项,并且必须在数据库的单个单元格中包含成员ID,那么至少使用逗号而不是分号作为分隔符。这将允许您使用MySQL的:


存储的一种方法是使用json数组:将member_id定义为VARCHAR并存储priviliges id,如下所示:

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

使用json解码,您可以在需要时获取成员。

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

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

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

然后更改存储成员的方式,否则您将继续遇到问题。。。。规范化数据库表,然后更改存储成员的方式,否则将继续遇到问题。。。。规范化您的数据库表唯一的选择方法是使用LIKE with 11,而这不是我想要的。为什么?检查当前id是否在特权数组中。无论如何,你必须搜索所有对话id…告诉我你想怎么做?请尝试使用完整的英语单词,而不是txt缩写。有些人依赖于翻译工具,或者不熟悉所有这些单词。在Postgres中,这些类型的JSON列可以通过它们包含的元素进行索引,它们的性能相当好,但遗憾的是MySQL的支持相比之下非常有限。在这里使用JSON并不一定是最好的调用。MySQL 5.7还增加了对搜索包含JSON的字段的支持。但是我认为它们没有索引,所以速度会很慢。唯一的选择方法是使用LIKE with 11,这不是我想要的?检查当前id是否在特权数组中。无论如何,你必须搜索所有对话id…告诉我你想怎么做?请尝试使用完整的英语单词,而不是txt缩写。有些人依赖于翻译工具,或者不熟悉所有这些单词。在Postgres中,这些类型的JSON列可以通过它们包含的元素进行索引,它们的性能相当好,但遗憾的是MySQL的支持相比之下非常有限。在这里使用JSON并不一定是最好的调用。MySQL 5.7还增加了对搜索包含JSON的字段的支持。但我认为它们没有索引,所以速度会很慢。值得注意的是,在非平凡大小的表上,FIND_IN_SET的性能通常非常糟糕。如果索引正确,第一个查询应该在接近零的时间内运行,但是第二个查询可能会因为必须扫描每一行而破坏服务器。使用JOIN-mi
ght也可以简化第一个查询。每行的查询速度非常快,但是如果您有一亿次对话,那么在扫描该表时祝您好运。值得注意的是,在大小不等的表上,FIND_IN_SET的性能通常非常差。如果索引正确,第一个查询应该在接近零的时间内运行,但是第二个查询可能会因为必须扫描每一行而破坏服务器。使用联接也可以简化第一个查询,但每行的查询速度相当快,但是如果您有一亿次对话,那么扫描该表会很幸运。