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以适应新客户的编号系统,我们将更改上次工作的过去记录。