0

我正在使用与此类似的数据库设计在 MySQL 和 PHP 中创建一个网上商店(见图)
我没有遇到不同规格的多价商品的问题,就像上面链接的问题一样。

这将是一个电脑网上商店,所以我不需要为每个产品制定规格。例如,我可以对它们进行分类。智能手机、笔记本电脑……并为每个类别添加规格。
智能手机可能有:品牌、处理器类型、屏幕尺寸、颜色、电池、价格等。
笔记本电脑:处理器、显卡、品牌、价格、尺寸……

我也认为不需要[combinations]桌子,因为在我看来,不必要地存储太多了。

我的问题是过滤产品。我可以轻松地选择所有这些,或者只选择一个,或者例如。选择所有白色手机或所有白色或金色手机,但我无法选择所有具有 8MP 前置摄像头的白色手机。

表结构::
[products] id、name、category_id、description

[categories]:身份证,姓名

[specifications]:id,category_id,名称

[spec_values]: id、product_id、spec_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 经验,有没有更好的解决方案我没有注意到?预先感谢您的任何帮助。祝你有美好的一天!

4

1 回答 1

0

您可以为此使用聚合。包括一个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子句中的逗号分隔列表上使用显式连接语法以提高可读性。

于 2018-12-26T11:04:22.297 回答