2017-05-17 50 views
0

我正在爲電子商務平臺搜索算法。該平臺能夠爲不同產品創建變體,並且產品的所有可用變體均包含在逗號分隔列中。這裏是所有的領域。在逗號分隔的數據庫列中查找項目

  1. product_id - 例如1
  2. variation_combo - 例如54,35,49(這些是逗號分隔爲不同的變化IDS)
  3. product_name - 例如 「耐克牌T恤」

這裏是我想達到什麼,就像

  • SELECT product_id FROM table where variation_combo contains 35 AND 54 AND 49
  • SELECT product_id FROM table where variation_combo contains 35 AND 54
  • SELECT product_id FROM table where variation_combo contains 49
+0

永遠不要將數據存儲爲逗號分隔值。這隻會導致你很多麻煩。 – jarlh

+0

擁有這樣的'variation_combo'是一個設計缺陷。考慮將列表值存儲在詳細表中。 –

+0

是的,我知道這一點。但是我正在研究的這個軟件存在這個缺陷,現在改變它將會非常困難。所以我們決定繼續它。 –

回答

2

參見本: MySQL query finding values in a comma separated string

select product_id from table where find_in_set('35',variation_combo) <> 0 and 
find_in_set('54',variation_combo) <> 0 and find_in_set('49',variation_combo) <> 0 
+0

這甚至提供了優化的潛力。引用[文檔](https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set):_「如果第一個參數是一個常量字符串,第二個參數是SET類型的列,FIND_IN_SET()函數被優化以使用位算術。「_ +1 –

+0

謝謝@DmitryEgorov,我真的很喜歡你的解決方案,但我測試了性能,kapil的查詢速度更快:) –

+0

@omerFarooq:是的,同意,'find_in_set'絕對適合你的案例。記錄:) –

2

您可以使用like關鍵字

SELECT product_id FROM table where variation_combo LIKE '%35%' AND LIKE '%54%' AND LIKE '%49%' 

我希望這有助於

+0

如果'variation_combo'的值是'354',該怎麼辦?我懷疑它應該被選中。 –

+0

嗯,我想到了,但問題是,如果variation_combo包含 154,135,145,那麼即使該產品不應該被選中,也會選擇該產品。 –

+0

@DmitryEgorov,yup同樣的想法 –

1

我強烈建議重新設計和移動列表值到細節表。

但是,如果您絕對與現場設計中的列表綁定,則可以使用RLIKE檢查列表中的值。如果這些ID只是字母數字(或更準確地說不包含字邊界,如001-01),則任何單個ID都可以與\bID\b正則表達式匹配。所以,你的發言會變成

SELECT product_id 
    FROM table 
    where variation_combo RLIKE '\\b35\\b' 
     AND variation_combo RLIKE '\\b54\\b' 
     AND variation_combo RLIKE '\\b49\\b' 

SELECT product_id 
    FROM table 
    where variation_combo RLIKE '\\b35\\b' 
     AND variation_combo RLIKE '\\b54\\b' 

SELECT product_id 
    FROM table 
    where variation_combo RLIKE '\\b49\\b'