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

Php MYSQL在字段中搜索特定的单词或数字,不包括包含这些单词或数字的单词或数字,php,mysql,regex,wildcard,sql-like,Php,Mysql,Regex,Wildcard,Sql Like,我正在搜索焊缝焊工id和焊缝bal焊工id,它们是由用户用空格分隔的唯一焊工id列表 记录集看起来像99,199,99 w259,w259 259 5-a 99199259,5-a和w259是唯一的焊工id号 我不能单独使用MYSQL INSTR()函数,因为搜索“99”会调出带有“199”的记录 每个项目的用户通常以不同的方式(000、a000、0aa)格式化焊工ID,以匹配其客户记录 我确实希望避免使用PHP代码,原因有很多 要在焊工id或bal\u焊工id列中选择带有“w259”的记录,我

我正在搜索
焊缝
焊工id
焊缝
bal焊工id
,它们是由用户用空格分隔的唯一焊工id列表

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

99199259,5-a和w259是唯一的焊工id号

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

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

我确实希望避免使用PHP代码,原因有很多

要在
焊工id
bal\u焊工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条测试记录

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

有更好的办法吗


谢谢。

如果我正确理解您的问题,一个选项是使用string函数,它返回字符串
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)

但是,优化器不能做得太多,因为如果存在索引,则在\u集中查找\u不能使用索引。如果可能的话,我建议您规范化您的表。

如果我正确理解您的问题,一个选项是使用string函数,它返回字符串
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)

但是,优化器不能做得太多,因为如果存在索引,则在\u集中查找\u不能使用索引。如果可能的话,我建议您将表格正常化。

谢谢,这看起来更专业,但所需时间相同。该应用程序已启动并正在运行,因此在下一版本的读/写操作之前,我可能需要执行一个PHP str_replace()来交换逗号/空格。值得吗?如何规范化表?我很难在这个字段中存储索引,因为我不想更改“永久”记录。如果我们更改焊工的ID以适应新客户的编号系统,我们将更改上次工作的过去记录。谢谢,这看起来更专业,但所需时间相同。该应用程序已启动并正在运行,因此在下一版本的读/写操作之前,我可能需要执行一个PHP str_replace()来交换逗号/空格。值得吗?如何规范化表?我很难在这个字段中存储索引,因为我不想更改“永久”记录。如果我们更改焊工的ID以适应新客户的编号系统,我们将更改上次工作的过去记录。