如何在单个 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'
或
$query = SELECT name from table WHERE num = '22' or num = 41
// result should be John and Mike
我正在使用 PHP,所以我知道我可以在输入数据时序列化数据,然后反序列化并搜索结果数组,但是数据集非常大,所以这将是一个非常慢的查询,因为我必须检索整个数据集并循环生成的数组。
有什么我可能错过的吗?我真的不想为每个可能的选项创建一个表,因为每个组中绝对有大量的组和许多选项。
有什么想法吗?提前致谢
编辑:上面的示例只是一个示例,可以有任意数量的“nums”
最佳答案
为了获得最佳速度和效率,请将“nums”放在链接到 ids 的单独表中。
使用LIKE也可以工作,但是它还需要与字符串的一部分进行比较。根据数据集的大小,这也可能需要一些时间。
另一个选项是使用 word boundaries 的 mysql 正则表达式即:
SELECT name from table where nums REGEXP '[[:<:]]##[[:>:]]';
这些选项中的每一个都可以工作,但是将数据移动到单独的表是正确的方法,尤其是在存在很多可能性的情况下。
对于此方法,您需要三个表
People
-------
ID
NAME
Options
-------
ID
OPTION
Options_People
--------------
OPTION_ID
PEOPLE_ID
要让所有“人”都选择特定选项,请执行以下操作:
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#)
关于PHP MySQL 在一个字段中搜索多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4471703/