选择仅包含某些产品的存储桶

时间:2015-01-02 12:41:51

标签: php mysql sql

我需要帮助才能找到开发脚本的最佳解决方案。 假设我们有3个桶(3个不是固定数量,桶的数量会定期更改): Bucket1,Bucket2,Bucket3。

每个产品都包含一些产品:

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

我将使用input type:text从键盘中获取一些产品,如下所示:

苹果,柠檬,面包,番茄,意大利腊肠,咖啡,酸橙

我需要找到一种方法来开发SQL数据库和PHP脚本,这样它才会选择只包含列表中产品的存储桶。它可以包含更少但不是更多,并且所有桶项都可以在"输入类型的列表中找到:text"。

所以这只会选择Bucket1和Bucket3

我最糟糕的事情是开发数据库架构。请你能给我一个想法,这样我就可以开始了吗?

我可以爆炸input值,这样我就会得到一个包含所有必需项目的数组,但我真的很不满意。

1 个答案:

答案 0 :(得分: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