[英]MySQL - find field with comma separated value by all combinations of a set of numbers
我們在MySQL中有一個產品表,其中的每一行都有一個字段,其中用逗號分隔的選項值可以組合成該產品。 在下面的方案中,您可以看到兩個表。 逗號分隔值的字段是option_ids,例如,可以看起來像2,5,6,23或4,2,76。 這些數字是存在於選項表中的選項。
產品:
|product_id|name|description|option_ids|price|
選項:
|option_id|type_id|label|group|pos|count|price|
我們得到的輸入是一組唯一的選項。 我們想在option_ids中找到所有具有此選項集或其子集的產品。
現在,我們的方法是生成選項數組的冪集,以便我們擁有選項數組的所有可能組合。 然后,我們在“ OR WHERE”語句中生成一個對所有這些組合進行查詢的mysql查詢。
這里的問題是冪集呈指數增長,所以當我們有16個唯一選項的數組時,冪集提供了65536種可能性。 為了正常工作,我們不得不增加php的內存使用率,但是現在由於查詢變得如此龐大而遇到了MySQL問題。
有沒有其他方法可以解決這個問題?
希望我提供了足夠的信息,如果沒有,請務必提出!
編輯:第三張表會給我們帶來同樣的問題,因為我們需要找到以下子集...不是說選項陣列是一個產品,它可以是一個產品,但也可以是2或3個產品。 例如:選項1,2使產品A,選項2,3使產品B,選項4,5,6使產品C。如果我們有選項數組[1,2,4,5,6],我們希望查找產品A和C。
使用第三張表:
Product_Option_Assoc(product_id,option_id)
對於產品應具有的每個選項,請在該表中插入一行。 這為您提供了產品和選件之間真正的一對多關系。 選項的數量可以輕松變化,並且很容易查詢以提取數據和進行更新(無需逗號解析)。
查詢示例:獲取具有相關選項的產品:
$options = array(1, 55, 23); // hard coded but could come from a form (remember to validate/cast as ints)
$optionCommaList = implode(',', $options);
SELECT
p.name
FROM
Product_Option_Assoc a
LEFT JOIN
Products p ON p.product_id = a.product_id
WHERE
a.option_id IN ($optionCommaList);
使用FIND_IN_SET(str,strlist)會成功嗎?
我不確定它的效率,但是會為您提供一種搜索具有特定選項的產品的簡便方法。
通過將選項列表轉換為單個字符串,您將失去數據庫的所有功能,並迫使自己使用字符串匹配和其他沖突。 使用鏈接表。 這是正確的方式。 然后找出如何編寫查詢。
Product_option ( product_id, option_id )
這就是您要說的:
例如:選項1,2使產品A,選項2,3使產品B,選項4,5,6使產品C。如果我們有選項數組[1,2,4,5,6],我們將要查找產品A和C。
要改寫,要檢索沒有這不是你的查詢陣列中的一個選項的所有產品。 方法如下:
SELECT * from Product WHERE NOT EXISTS (
SELECT product_id id, option_id opt from Product_option
WHERE id = Product.product_id AND opt NOT IN (1, 2, 4, 5, 6)
)
您可以通過EXISTS
顯式地執行此操作,但是我認為EXISTS
查詢可以更清楚地了解該想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.