2015-01-02 44 views
0

我需要幫助以找到開發腳本的最佳解決方案。 假設我們有3個桶(3不是固定數量,桶的數量將會正式改變): Bucket1,Bucket2,Bucket3。選擇只包含部分產品的存儲桶

他們每個人都包含一些產品:

Bucket1: apple, lime, tomato 
Bucket2: tomato, lemon, cuccumber 
Bucket3: bread, salami, coffee 

我將使用一個input type:text得到一些產品從鍵盤這樣的:

蘋果,檸檬,麪包,西紅柿,香腸,咖啡,石灰

我需要找到一種方法來開發SQL數據庫和PHP腳本,因此它只會選擇只包含列表中的產品的存儲桶。它可以包含更少但不是更多,並且可以在「input type:text」列表中找到所有存儲桶項目。

因此,這將只選擇Bucket1和Bucket3

我最糟糕的鬥爭正在開發的數據庫架構。你能否給我一個想法,讓我有一個開始的道路?

我可以爆炸input的價值,所以我會有一個數組與所有必需的項目,但我真的堅持其餘的。

回答

2

的方案應該是這樣的:

CREATE TABLE buckets (
    bucket_num INTEGER NOT NULL, 
    product VARCHAR(30) NOT NULL, 
    UNIQUE KEY(bucket_num, product) 
); 

這將有像行:

bucket_num product 
1   apple 
1   lime 
1   tomato 
2   tomato 
2   lemon 
2   cucumber 

有對桶的數量,或產品在桶中的數量沒有限制。

查詢到從產品列表中得到桶將是:

SELECT DISTINCT bucket_num 
FROM buckets 
WHERE product IN ('apple', 'lemon', 'bread', 'tomato', 'salami', 'coffee', 'lime') 
AND bucket_num NOT IN (
    SELECT bucket_num 
    FROM buckets 
    WHERE product NOT IN ('apple', 'lemon', 'bread', 'tomato', 'salami', 'coffee', 'lime') 
) 

另一種方式把它寫的是:

SELECT bucket_num, 
    COUNT(*) AS total_products, 
    SUM(product IN ('apple', 'lemon', 'bread', 'tomato', 'salami', 'coffee', 'lime')) AS matching_products 
GROUP BY bucket_num 
HAVING total_products = matching_products 
+0

謝謝!還有一個關於查詢的問題:它也會返回Bucket2嗎? –

+0

我誤解了你想要的,我會修改 – Barmar

+0

我不想讓它返回Bucket2,我想它只返回Bucket1和Bucket3。只有當其中的所有內容都可以在列表中找到時,它纔會返回一個存儲桶。 –