簡體   English   中英

MYSQL在字段中搜索特定的單詞或數字,但不包括包含這些單詞或數字的單詞或數字

[英]MYSQL search for specific word or number in field excluding words or numbers containing those

我在搜索welds welder_idwelds bal_welder_id ,是用戶用空格分隔的唯一焊工ID的列表。

該記錄集看起來像9919999 w259w259 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;

它可以工作,但是需要花費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無法使用索引(如果存在),因此優化器不能太多使用。 如果可能的話,我建議您標准化表格。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM