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

标签 php mysql regex wildcard sql-like

我正在搜索 welds.welder_idwelds.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_idbal_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/

相关文章:

javascript - 正则表达式匹配字符串中的字母和数字,可选地具有一组特殊字符

php - 如何处理基于 MVC 的网站中的状态消息?

php - Laravel 和多个数据库连接

php - Ajax : how to send backslash in data?

php - for 循环从 mysql 数据库中返回第 5 个计数的字符串 1-30 和 13count,使用 php 匹配数字

mysql - 使用撇号、连字符、双大写的 SQL 名称搜索

php - 让 PHP 在 Linux Box 上运行应用程序

mysql - 如何在 Sequel 中使用存储过程

php - Yii:路由的 URL 模式不是有效的正则表达式

javascript - javascript中正则表达式的 "CouldBe"逻辑