我正在搜索 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;
它有效,但在我工作站的 SSD 上有 1300 条测试记录需要 0.0030 秒。
一两年后实际的DB会有几十万
有没有更好的办法?
谢谢。
最佳答案
如果我正确理解您的问题,一种选择是使用 FIND_IN_SET(str, strlist) 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)
但是优化器不能太多,因为 FIND_IN_SET 不能使用索引(如果存在)。如果可能的话,我建议您规范化您的表格。
关于php - MYSQL搜索字段中的特定单词或数字,不包括包含这些单词或数字的单词或数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34254464/