2015-12-13 35 views
1

我尋找welds單詞或數字領域中的特定單詞或數字。 welder_idweldsbal_welder_id這是由用戶用空格分隔的唯一焊工ID列表。MYSQL搜索排除包含這些

記錄集看起來像9919999 w259w259 259 5-a

99,199,259,5-A和w259是唯一的焊工ID號

我不能使用MYSQL INSTR()函數本身作爲搜索爲「99」將拉動對每個項目格式爲「199」

用戶記錄自己的焊工ID的不同的方式(000,a000,0aa)通常以滿足他們的客戶的記錄。

我真的想避免使用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將有幾十萬一年或兩年後。

有沒有更好的方法?

謝謝。

回答

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不能使用索引(如果存在)。如果可能的話,我建議你規範你的表格。

+0

謝謝,這看起來更專業,但它需要的時間是相同的。該應用程序已啓動並正在運行,因此在讀取/寫入下一個版本之前,我可能必須先執行PHP str_replace()以交換逗號/空格。這會值得嗎?你如何使桌子正常化? – Larry

+0

因爲我不想修改「永久性」記錄,所以在這個字段中存儲索引時會很難。如果我們更改焊工的ID以適應新客戶的編號系統,我們會改變過去的記錄來查看我們所做的最後一項工作。 – Larry