簡體   English   中英

MySQL-用一組數字的所有組合查找帶有逗號分隔值的字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM