PHP MySQL在一个字段中搜索多个值

PHP MySQL在一个字段中搜索多个值,php,mysql,search,multiple-value,Php,Mysql,Search,Multiple Value,如何在单个SQL字段中存储多个值并确保此数据可搜索 例如,我希望能够做到这一点 name | num ----------- John | 21, 22, 34 Mike | 41, 32, 43 Dave | 12, 23, 34 $query = SELECT name from table WHERE num = '12' // result should be 'Dave' 或 我使用PHP,因此我知道我可以在输入数据时序列化数据,然后取消序列化并搜索结果数组,但数据集非常大,因

如何在单个SQL字段中存储多个值并确保此数据可搜索

例如,我希望能够做到这一点

name | num
-----------
John | 21, 22, 34
Mike | 41, 32, 43
Dave | 12, 23, 34


$query = SELECT name from table WHERE num = '12' 
// result should be 'Dave'

我使用PHP,因此我知道我可以在输入数据时序列化数据,然后取消序列化并搜索结果数组,但数据集非常大,因此这将是一个非常缓慢的查询,因为我必须检索整个数据集并循环搜索结果数组

有什么我可能错过的吗?我真的不想为每个可能的选项创建一个表,因为每个选项中绝对有大量的组和许多选项

有什么想法吗?提前谢谢


编辑:上述示例只是一个示例,可能有任意数量的“num”

num pivot表的名称可能是实现这一点最优雅的方法

您应该这样做:

name | num
-----------
John | 21, 22, 34
Mike | 41, 32, 43
Dave | 12, 23, 34


$query = SELECT name from table WHERE num = '12' 
// result should be 'Dave'
为每个组合创建一个条目:

John | 21
John | 22
John | 23
Mark | 19
Mark | 22
如果您在youtable中有任何传统信息,请创建2个表:

Users:
UserId |FirstName |Lastname
1      |John      |Doe
2      |Mark      |Hamill

   Options:
    UserId |Num
          1| 21
          1| 22
          1| 23
          2| 19
          2| 22
如果必须坚持现有的数据库结构 只需一列,就可以将其存储为text/varchar。 只需在字符串的开头和每个数字| 21 | 21 | 23 |之后放置一个管道(或任何其他字符)。然后可以使用类似“%”23 |的搜索


这非常缓慢和丑陋,但有时添加表或AOLUM不是一个选项。

为了获得最佳速度和效率,请将“NUM”放在一个单独的表中,链接到ids

使用也可以,但是它还需要与字符串的一部分进行比较。根据数据集的大小,这也可能需要一些时间

另一个选项是使用ie的mysql正则表达式:

要让所有“人”都有一个特定的选择,需要:

SELECT p.* FROM People p, Options_People op 
WHERE p.ID = op.PEOPLE_ID and OPTION_ID = #option#
要使用多个选项中的任意一个获取所有“人员”:

SELECT p.* FROM People p, Options_People op 
WHERE p.ID = op.PEOPLE_ID and OPTION_ID IN ( #option1#,#option2#,#option#)

从“按名称分组”表中选择“名称”、“分组”(num)是否意味着为每组选项创建一个表,每个选项有一行,另一个表链接这两个选项?您应该为“名称”和“num”的每个有效组合创建一个条目。约翰| 21;John | 22,John | 23这样做会比使用联接慢吗?对我来说,问题是其中的选项组和选项的数量太多了——目前存储为PHP数组,我渴望找到一个合适的解决方法。速度要慢得多!如果你有其他选择,不要这样做。只做了一次,因为我们有一些使用数据库的第三方软件,如果我修改数据库连接可以使用索引,它们会崩溃。Ashley,它们不像你说的那么邪恶。它们是比这更好的解决方案。
SELECT p.* FROM People p, Options_People op 
WHERE p.ID = op.PEOPLE_ID and OPTION_ID = #option#
SELECT p.* FROM People p, Options_People op 
WHERE p.ID = op.PEOPLE_ID and OPTION_ID IN ( #option1#,#option2#,#option#)