【问题标题】:MYSQL search for specific word or number in field excluding words or numbers containing thoseMYSQL 在字段中搜索特定单词或数字,不包括包含这些的单词或数字
【发布时间】:2015-12-13 18:07:36
【问题描述】:

我正在搜索 welds.welder_idwelds.bal_welder_id,它们是由用户用空格分隔的唯一焊工 ID 列表。

记录集看起来像99,199,99 w259,w259 259 5-a

99,199,259,5-a 和 w259 是唯一的焊工 ID 号

我不能单独使用 MYSQL INSTR() 函数,因为搜索“99”会提取“199”的记录

每个项目的用户通常以不同的方式(000,a000,0aa)格式化他们的焊工 ID,以匹配他们客户的记录。

出于多种原因,我真的想避免使用 PHP 代码。

要在welder_idbal_welder_id 列中选择带有“w259”的记录,我的查询如下所示。

SELECT * FROM `welds` 
WHERE `omit`=0 
AND(    (`welder_id`='w259' OR `bal_welder_id`='w259')
     OR (`welder_id` LIKE 'w259 %' OR `bal_welder_id` LIKE 'w259 %')
     OR (`welder_id` LIKE '% w259' OR `bal_welder_id` LIKE '% w259')
     OR (INSTR(`welder_id`, ' w259 ') > 0 OR INSTR(`bal_welder_id`,' w259 ') > 0))
ORDER BY `date_welded` DESC 
LIMIT 100;

它可以工作,但它需要 0.0030 秒,我的工作站 SSD 上有 1300 条测试记录。

实际的数据库在一两年后会有几十万。

有没有更好的办法?

谢谢。

【问题讨论】:

    标签: php mysql regex wildcard sql-like


    【解决方案1】:

    如果我正确理解您的问题,一种选择是使用FIND_IN_SET(str, strlist) 字符串函数,它返回字符串str 在逗号分隔的字符串列表strlist 中的位置,例如:

    SELECT FIND_IN_SET('b','a,b,c,d');
    

    将返回 2。由于您的字符串不是用逗号分隔,而是用空格分隔,因此您可以使用 REPLACE() 将空格替换为逗号。你的查询可以是这样的:

    SELECT * FROM `welds` 
    WHERE
      `omit`=0
      AND
      (FIND_IN_SET('w259', REPLACE(welder_id, ' ', ','))>0
      OR
      FIND_IN_SET('w259', REPLACE(bal_welder_id, ' ', ','))>0)
    

    但是优化器不能太多,因为 FIND_IN_SET 不能使用索引,如果存在的话。如果可能的话,我建议你规范化你的表格。

    【讨论】:

    • 谢谢,这看起来更专业,但需要的时间相同。该应用程序已启动并正在运行,因此我可能必须执行 PHP str_replace() 来交换逗号/空格,然后才能读取/写入下一个版本。值得吗?您将如何规范化表格?
    • 我很难在该字段中存储索引,因为我不想更改“永久”记录。如果我们更改焊工的 ID 以适应新客户的编号系统,我们将更改我们上一份工作的过去记录。
    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多