Select 只包含一些产品的桶

Select bucket containing only some products

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

他们每个人都包含一些产品:

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

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

苹果、柠檬、面包、西红柿、萨拉米香肠、咖啡、酸橙

我需要找到一种方法来开发 SQL 数据库和 PHP 脚本,这样它只会 select 只包含列表中产品的存储桶。它可以包含更少,但不能更多,并且所有存储桶项目都可以在 "input type:text".

的列表中找到

所以这只会 select Bucket1 和 Bucket3

我最大的困难是开发数据库模式。你能给我一个想法,这样我就可以有一条开始的路吗?

我可以展开 input 值,这样我就会得到一个包含所有必需项目的数组,但我真的对其余部分一筹莫展。

方案应该是这样的:

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