MySQL查询以按属性过滤

时间:2019-03-20 05:15:45

标签: mysql

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

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

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

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

当前查询显示正确的结果。但是产品计数为S大小是错误的。我尝试了不同的方法。但是在我看来,无法按我的要求对其进行查询。

在提出问题时,我省略了一些细节以简化问题(看起来很复杂)。我在where关系上有其他products子句(按价格过滤)。

修改 诀窍是where groups.id = 1的位置和位置条件。它会破坏所有先前条件的产品计数。

1 个答案:

答案 0 :(得分:0)

如您所说

当前查询显示正确的结果。但是产品计算出的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
相关问题