我正在搜索weldswelder_idweldsbal_welder_id,它们是由用户隔开的唯一焊工ID的列表。

记录集看起来像9919999 w259w259 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条测试记录。

一两年后,实际的数据库将有数十万个。

有没有更好的办法?

谢谢。

最佳答案

如果我正确理解了您的问题,一种选择是使用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 - MYSQL在字段中搜索特定的单词或数字,但不包括包含这些单词或数字的单词或数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34254464/

10-14 11:53