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

时间:2015-12-13 18:07:37

标签: php mysql regex wildcard sql-like

我正在搜索weldswelder_idweldsbal_welder_id,这些是由用户以空格分隔的唯一焊工ID列表。

记录集看起来像9919999 w259w259 259 5-a

99,199,259,5-a和w259是唯一的焊工识别码

我不能单独使用MYSQL INSTR()函数来搜索" 99"将使用" 199"

提取记录

每个项目的用户通常以不同的方式(000,a000,0aa)格式化他们的焊工ID,以匹配他们客户的记录。

出于多种原因,我真的想避免使用PHP代码。

使用" w259"选择记录在welder_id列中bal_welder_idSELECT * 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; 列中,我的查询如下所示。

$rentingsquery = "SELECT * FROM TBL_rentings
    JOIN TBL_rentings ON TBL_properties.propertyId = TBL_rentings.propertyId
    JOIN TBL_people ON TBL_rentings.personId = TBL_people.personId
    WHERE personId='$personId'";
    $rentingsResult=mysql_query($rentingsquery) or die ("Query to get data from TBL_properties failed: ".mysql_error());

它可以工作,但在我的工作站的SSD上有1300条测试记录需要0.0030秒。

一年或两年后,实际的数据库将有数十万。

有更好的方法吗?

感谢。

1 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,一个选项是使用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不能使用索引(如果存在)。如果可能的话,我建议你将你的桌子标准化。