2013-10-29 22 views
0

我有一個情況:查找與數據庫中完全匹配的結果 - 哪種方式更好?

我有一個數據庫(MySQL的),其中包含產品及其代碼這樣

BLACK SUGAR BS 709 
HOT SAUCE AX889/9 
TOMY 8861 

我有一個Excel電子表格,我轉換成CSV,這包含了產品價格。其結構由2列,代碼和價格,這樣的:

BS709   23.00 
AX 889 /9  10.89 
8861   1.69 

我做了一個腳本,通過搜索數據庫中相應的商品條碼,使用LIKE%的查詢一個foreach和%以更新產品的價格。在CSV

FOREACH行,使用「WHERE PRODUCT_CODE LIKE%代碼%搜索數據庫。

這是offcourse更新價格的原始和不那麼succesfull方式,因爲在CSV代碼是不完全匹配(語法)與數據庫中的,所以如果我有兩個產品在DB在其代碼中包含BS709(BS70923)我得到多個匹配。

是否有這樣做的更好的辦法?

+0

第一步是數據庫不可知的。你必須定義一個匹配算法。問問自己正確的問題(例如,BS 709是否必須符合BS709?)。然後你可以看看mysql的FULLTEXT搜索方法('MATCH'等) – Sebas

+0

請記住,MySQL不區分大小寫,可能是你的情況中的祝福或詛咒。 –

+0

我會考慮FULLTEXT –

回答

0

你可以在比較之前使用MySQL replace()修剪空格和其他字符的列,這將返回所有前行爲匹配,無論包含任何空間。

SELECT * FROM table WHERE REPLACE(product_code, ' ', '') LIKE 'code'

+0

我確實使用TRIM刪除空格和字符,問題是產品有類似的代碼,例如當搜索BS 709和數據庫時,我有產品BS 709和BS 7092,BS 709/2。所有三場比賽。 –

+0

如果您消除通配符,並搜索「BS 709」,它將只匹配「BS 709」,而不匹配其他。請參閱我的查詢中沒有使用'%'。 TRIM很好,但它只能操縱開始或結尾空格(不是空格,不能通過字符串) –

+0

我的意思是REPLACE不是TRIM,對不起。 是的,但我仍然必須使用通配符,因爲在數據庫中,列還包含「BLUG SUGAR」,「TOMY」等,並且符合條款「NAME + code」列。如果我使用%LIKE之類的東西,只有前端通配符會處理前綴文本,該怎麼辦? 場景: 在數據庫中可以說我有這些: '黑糖BS709 黑糖BS7092 黑糖BS70' 使用LIKE%%BS709我得到了前兩個! 使用%LIKE BS709我只得到第一個,我認爲它可以嗎?不是? –

0

鑑於你的例子,我會建議去除這兩個所有空格,然後就看時的代碼開頭或結尾完全一致的:

where replace(e.code, ' ', '') like concat(replace(db.code, ' ', ''), '%') or 
     replace(e.code, ' ', '') like concat('%', replace(db.code, ' ', '')) or 
     replace(db.code, ' ', '') like concat(replace(e.code, ' ', ''), '%') or 
     replace(db.code, ' ', '') like concat('%', replace(e.code, ' ', '')); 

這可能不適合工作當一個代碼是另一個代碼的前綴時的具體情況。

無論如何,如果電子表格中的產品代碼與數據庫中的產品代碼不同,我認爲您會遇到更大的問題。如果您無法真正修復電子表格,我會建議您手動/半自動地在數據庫中創建一個同義詞表。這將在一列中包含Excel產品代碼,在另一列中包含正確的產品代碼。然後,您可以通過將它們結合在一起來進行查找。

是的。這是工作。但是,可能比掙扎在這個問題上的工作要少,而且得到的結果必須反覆更新。