如何在单个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'
答案 0 :(得分:3)
为获得最佳速度和效率,请将“nums”放在一个链接到ID的单独表格中。
使用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#)
答案 1 :(得分:2)
你应该这样做:
为每个组合提供一个条目:
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 |之后。然后你可以用LIKE'%| 23 |%'
进行搜索这很慢,很丑,但有时候添加桌子或小杵不是一种选择。
答案 2 :(得分:0)
编号数据透视表的名称可能是执行此操作的最佳方式
答案 3 :(得分:0)
SELECT name,GROUP_CONCAT(num)FROM table_name GROUP BY name