在多列中搜索多个值

Tyl*_*den 6 mysql performance select where query-performance

我有一个包含这些字段的表结果:

  • ID
  • 结果 ID
  • number_one (int)
  • number_two (int)
  • number_three (int)
  • number_four (int)
  • 数字五(整数)

每个 number_* 列可以包含一个从 01 到 90 的数字。

我有一个带有 90 个复选框的搜索表单。用户最多可以勾选 5 个复选框。

一旦用户选择 n 复选框,我需要构建一个查询来查找包含所有这些值的行,但数字可以位于五列中的任何一列。

例子:

用户勾选复选框 02、12 和 20。我需要检索所有三个数字的所有行,但我的数字可以在任何 number_* 列中。20 可以在 number_one 列中,02 可以在 number_three 列中,12 可以在 number_four 列中。如何构建此查询?

另外,使用一列而不是五列会更好吗?结果表:

  • ID
  • 结果 ID
  • 数字(字符串)

列号包含 02-12-20-57-84,其中 - 是分隔符。

示例:用户勾选复选框 02、12 和 20。所以我的查询将是

SELECT * 
FROM results 
WHERE numbers LIKE "%02%" 
    AND numbers LIKE "%12%" 
    AND numbers LIKE "%20%";
Run Code Online (Sandbox Code Playgroud)

更新:我目前正在使用 MySQL 进行此设置:

  • ID
  • 结果 ID
  • number_one (int)
  • number_two (int)
  • number_three (int)
  • number_four (int)
  • 数字五(整数)
  • 日期
  • 城市(外键)

我计划移动寻找优化和更快的替代方案。我可以仅针对此特定表迁移到任何其他数据库。如果需要,我也可以更改表结构。该表中有大约 150k 条记录执行类似于以下内容的查询:

SELECT *
FROM TableName
WHERE '02' IN (Number_1, Number_2, Number_3, Number_4, Number_5)
  AND '12' IN (Number_1, Number_2, Number_3, Number_4, Number_5)
  AND '20' IN (Number_1, Number_2, Number_3, Number_4, Number_5)
Run Code Online (Sandbox Code Playgroud)

迁移到另一种 DBMS 类型会带来好处吗?

Ken*_*her 6

我个人会创建你的表

  • ID
  • 结果 ID
  • 价值

但是在值列中只有一个值。现在您可以在 value 列上建立索引,这应该会大大加快速度。您的查询将如下所示:

SELECT result_id
FROM TableName
WHERE VALUE IN ('02','12','20')
GROUP BY result_id
HAVING COUNT(1) >= 3
Run Code Online (Sandbox Code Playgroud)

这样做的好处之一是您现在可以轻松检查 1 个匹配项、2 个匹配项等。您还可以将他们可以检查的项目数量增加到 50 个,并且您的表结构不必更改。

现在说这对你不起作用。现在我会使用这样的东西:

SELECT *
FROM TableName
WHERE '02' IN (Number_1, Number_2, Number_3, Number_4, Number_5)
  AND '12' IN (Number_1, Number_2, Number_3, Number_4, Number_5)
  AND '20' IN (Number_1, Number_2, Number_3, Number_4, Number_5)
Run Code Online (Sandbox Code Playgroud)