MYSQL 在字段中搜索特定单词或数字,但不包括包含这些单词或数字的单词或数字

MYSQL search for specific word or number in field excluding words or numbers containing those

我正在搜索 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 代码。

对于 select 在 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;

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

一两年后实际DB会有几十万

有没有更好的方法?

谢谢。

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

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

will return 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 无法使用索引(如果存在)。如果可能的话,我建议您将 table 标准化。