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

时间:2010-12-17 15:00:42

标签: 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'

$query = SELECT name from table WHERE num = '22' or num = 41 
// result should be John and Mike

我正在使用PHP,所以我知道我可以在输入时序列化数据,然后反序列化并搜索生成的数组,但数据集非常大,所以这将是一个非常慢的查询,因为我将不得不检索整个数据集并遍历生成的数组。

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

有什么想法吗?提前致谢

编辑:以上示例只是一个例子,可能有任意数量的'nums'

4 个答案:

答案 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