[英]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代碼。
要選擇在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;
它可以工作,但是需要花費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.