2

如何在单个 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

4 回答 4

3

为了获得最佳速度和效率,请将“nums”放在链接到 id 的单独表中。

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

另一种选择是使用单词边界的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#)
于 2010-12-17T15:20:39.440 回答
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|%' 搜索

这是缓慢而丑陋的地狱,但有时添加表或 aolums 不是一种选择。

于 2010-12-17T15:10:40.380 回答
0

num 数据透视表的名称可能是最优雅的方法

于 2010-12-17T15:02:46.187 回答
0

SELECT name,GROUP_CONCAT(num) FROM table_name GROUP BY name

于 2013-02-05T21:33:04.107 回答