高级webshop过滤w/mysql

9q78igpj  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(257)

我正在用mysql和php制作一个数据库设计与此类似的webshop(见图片)
我没有一个不同规格的多个价格项目的问题,如在上面链接的问题。
这将是一个电脑网店,所以没有必要让我为每一个产品的规格。我可以把它们分类,比如智能手机,笔记本电脑。。。并为每个类别添加规范。
智能手机可能有:品牌、处理器类型、屏幕大小、颜色、电池、价格等。
笔记本电脑:处理器,显卡,品牌,价格,尺寸。。。
我也认为没有必要 [combinations] 在我看来,这张table是不必要的。
我的问题是过滤产品。我可以很容易地选择所有的,或只是一个单一的,或举例来说。选择所有白色手机或所有白色或金色手机,但我无法选择所有配备8mp前置摄像头的白色手机。
表结构: [products] :id、名称、类别\u id、描述 [categories] :id,名称 [specifications] :id,类别\u id,名称 [spec_values] :id,产品id,规格id,值
下面的sql返回所有不同的产品,这些产品是金色的,或者有一个8mp的前置摄像头。

SELECT products.id, products.name, spec_values.value AS Filter
FROM products, categories, specifications, `spec_values` 
WHERE products.category_id = categories.id 
    AND spec_values.product_id = products.id 
    AND ((specifications.name = 'Color' AND spec_values.value = 'Gold') 
        OR (specifications.name = 'Front Camera' AND spec_values.value = '8MP')) 
GROUP BY products.id;

我想有一个合乎逻辑的 AND 而是一个 OR 在它们之间,仅仅更改它不会返回任何结果,因为它不能在一行中实现,因为我的规范名称和值存储在多行中。
一种解决方案是使用sql CREATE TEMPORARY TABLE 但我认为这需要大量不必要的服务器端工作。
另一种方法是获取所有非不同的值,并用php对它们进行迭代,检查它们是否都存在;如果是的话,那么在页面上显示它们,但是,那一个也可能是混乱的。
有没有更好的解决方案,我没有注意到,由于我在sql方面的经验不足?事先谢谢你的帮助。祝你有美好的一天!

agyaoht7

agyaoht71#

您可以为此使用聚合。包括 HAVING 子句来检查计数是否与筛选器的数目匹配。除非您插入了两次(或更多)准确的规格值,否则您将知道满足该条件的产品必须过滤所有规格值。如果没有,则缺少一行(或多行),即一个(或多个)规范值。

SELECT products.id,
       products.name
       FROM products
            INNER JOIN spec_values
                       ON spec_values.product_id = products.id 
            INNER JOIN specifications
                       ON specifications.id = spec_values.spec_id
       WHERE specifications.name = 'Color' AND spec_values.value = 'Gold'
              OR specifications.name = 'Front Camera' AND spec_values.value = '8MP'
       GROUP BY products.id,
                products.name
       HAVING count(*) = 2;

顺便说一句,建议在中的逗号分隔列表上使用显式联接语法 FROM 更好的可读性条款。

相关问题