【问题标题】:MySQL query for filtering by attributes用于按属性过滤的 MySQL 查询
【发布时间】:2019-03-20 18:25:48
【问题描述】:

我想构建一个按属性过滤产品的查询。产品和属性与中间表_product_attributes 连接。每个属性都有组(如属性s 有组Size)。

  • 如果只选择了一个属性,则只应显示具有该属性的产品
  • 如果选择了来自一个属性组的多个产品,则应显示属于这些属性之一的产品。因此选择了更多属性 - 显示了更多产品
  • 如果选择了一组 (Size) 和另一组 (Color) 的属性,则应显示具有选定尺寸和选定颜色的产品。
  • 应为每个属性显示产品计数
  • 从该特定组中选择属性时,不会更改一个属性组中的产品计数。例如,S 码有 3 个产品,L 码有 4 个产品。如果选择 S 码或 L 码或选择 S 和 L 码,则应显示这些计数
  • 选择不同组的属性时应更改产品计数(如果选择了尺寸和颜色,则显示每种颜色的产品计数,考虑到产品应采用选定尺寸)
  • 如果在没有任何颜色的产品中选择了尺寸属性,则不显示颜色属性。
  • 如果选择了一组属性,则应显示该组的所有属性(仅显示)

这是 sql fiddle https://www.db-fiddle.com/f/cWqvBYp6vMKy3KbNedeiqd/1

简而言之,它是一个简单的过滤系统。当我尝试从选择属性的组中显示属性时,我的困扰开始了。就像选择 S 码一样,我也想显示 M 码。你可以看到它的小提琴。

当前查询显示正确结果。但是 S 尺寸的产品计数不正确。我尝试了不同的方法。但是在我看来,它无法按我的意愿查询。

在提出问题时,我省略了一些细节以使问题(看起来很复杂)变得简单。我在products 关系上有额外的where 子句(按价格过滤)。

编辑 诀窍是where groups.id = 1 的位置和方式。它打破了产品计数所有以前的条件。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    正如你所说,当前查询显示正确的结果。但是 S 码的产品计数不正确。

    解决此问题的一种方法是您可以使用 COUNT(DISTINCT _products.id),这只会计算不同的值

    SELECT DISTINCT _attributes.*, COUNT( DISTINCT _products.id)
     FROM _attributes
    INNER JOIN _product_attributes ON _product_attributes.attribute_id = _attributes.id
    INNER JOIN _products ON _products.id = _product_attributes.product_id
    INNER JOIN _groups `groups` ON `groups`.id = _attributes.group
    INNER JOIN _product_attributes pa1 ON _products.id = pa1.product_id
    INNER JOIN _attributes attributes1 ON pa1.attribute_id = attributes1.id
    INNER JOIN _groups ON _groups.id = attributes1.group
    INNER JOIN _product_attributes pa2 ON _products.id = pa2.product_id
    INNER JOIN _attributes attributes2 ON pa2.attribute_id = attributes2.id
    
    WHERE 
     (attributes1.id = 3) AND attributes2.id = 6  OR  groups.id = 1
    GROUP BY _attributes.id
    

    【讨论】:

    • 实际上它在我给定的示例中有效。但是问题被简化了(见最后我的编辑)。在实际查询中,我有按价格过滤的其他产品。并且有 `OR groups.id = 1` 使我的价格过滤不起作用。
    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多