MYSQL 在字段中搜索特定单词或数字,但不包括包含这些单词或数字的单词或数字
MYSQL search for specific word or number in field excluding words or numbers containing those
我正在搜索 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 代码。
对于 select 在 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) 字符串函数,它 return 是字符串 str
在逗号分隔字符串列表中的位置 strlist
,例如:
SELECT FIND_IN_SET('b','a,b,c,d');
will return 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 无法使用索引(如果存在)。如果可能的话,我建议您将 table 标准化。
我正在搜索 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 代码。
对于 select 在 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) 字符串函数,它 return 是字符串 str
在逗号分隔字符串列表中的位置 strlist
,例如:
SELECT FIND_IN_SET('b','a,b,c,d');
will return 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 无法使用索引(如果存在)。如果可能的话,我建议您将 table 标准化。