我想建立一个查询,用于按属性过滤产品。产品和属性与中间表_product_attributes
连接。每个属性都有一个组(例如属性s
也有一个组Size
)。
Size
)和另一组(Color
)的属性,则应显示具有所选尺寸和所选颜色的产品。这是sql小提琴https://www.db-fiddle.com/f/cWqvBYp6vMKy3KbNedeiqd/1。
简而言之,这是一个简单的过滤系统。当我尝试显示从中选择属性的组中的属性时,我的困扰就开始了。就像选择S大小一样,我也想显示M大小。您可以看到它摆弄。
当前查询显示正确的结果。但是产品计数为S大小是错误的。我尝试了不同的方法。但是在我看来,无法按我的要求对其进行查询。
在提出问题时,我省略了一些细节以简化问题(看起来很复杂)。我在where
关系上有其他products
子句(按价格过滤)。
修改
诀窍是where groups.id = 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