我正在搜索welds
。welder_id
和welds
。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_id
或bal_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/