MySQL过滤属性

时间:2011-12-27 17:37:56

标签: mysql sql e-commerce

我正在尝试创建一种更好的方法来过滤网站上的项目。实际过滤效果很好,但显示可用的选项让我很难过。

我正在使用此sql查询来获取特定类别的所有选项。

SELECT 
atr1.`type` , atr1.`value`
FROM 
`index-shop-filters` AS atr1 
JOIN 
`index-shop-filters` as atr2 ON atr1.`item` = atr2.`item`  
WHERE 
( atr2.`type` = 'sys-category' AND atr2.`value` = '1828' ) 
GROUP BY 
atr1.`type`, atr1.`value` 

但是当我添加一个选定的过滤器时,希望能够获得剩余的过滤器。它没有给我剩余的过滤器。相反,它会忽略第二个OR语句。

SELECT 
atr1.`type` , atr1.`value`
FROM 
`index-shop-filters` AS atr1 
JOIN 
`index-shop-filters` as atr2 ON atr1.`item` = atr2.`item`  
WHERE 
( atr2.`type` = 'sys-category' AND atr2.`value` = '1828' ) 
OR ( atr2.`type` = 'Manufacturer' AND atr2.`value` = 'Sony' )
GROUP BY 
atr1.`type`, atr1.`value`

我尝试添加HAVING COUNT(*)= 2但是没有得到正确的结果。

index-shop-filters中的数据是这样的。

项,类型,值

类型是系统类别,制造商,尺寸,颜色等。

当他们选择第一个选项(如sys-category)时,它将显示可用选项。如果他们然后选择制造商(如索尼),它将显示项目是索尼的可用选项,并在类别中。

1 个答案:

答案 0 :(得分:1)

好的,我想我终于明白了你要做的事情:你没有想要获得项目列表,你正试图获得一个项目列表过滤。对不起,我应该早点接受。

无论如何,现在我明白了这个问题,但我的答案并不是很好。你要做的事情是相当复杂的,只有一个连接就不能完成(据我所知)。我只能想到两种方法:使用多个子查询或多个连接。这两种解决方案都很复杂,不能很好地扩展,但这是我能想到的。

以下是一个使用子查询的可能解决方案,我推荐:

SELECT item, `type`, `value`
FROM `index-shop-filters` AS f
WHERE f.item IN (SELECT item FROM `index-shop-filters` WHERE `type` = 'sys-category' AND `value` = '1828')
AND f.item IN (SELECT item FROM `index-shop-filters` WHERE `type` = 'Manufacturer' AND `value` = 'Sony')

以下是使用联接的解决方案,更好,但不是很好

SELECT item, `type`, `value`
FROM `index-shop-filters` AS f
JOIN `index-shop-filters` AS f2 ON f.item = f2.item AND f2.`type` = 'sys-category' AND f2.`value` = '1828'
JOIN `index-shop-filters` AS f3 ON f.item = f3.item AND f3.`type` = 'Manufacturer' AND f3.`value` = 'Sony'

这就是我所拥有的一切。这两种解决方案都应该有效,但效果不佳。希望其他人能够提出一个聪明,可扩展的答案。