我正在尝试创建一种更好的方法来过滤网站上的项目。实际过滤效果很好,但显示可用的选项让我很难过。
我正在使用此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)时,它将显示可用选项。如果他们然后选择制造商(如索尼),它将显示项目是索尼的可用选项,并在类别中。
答案 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'
这就是我所拥有的一切。这两种解决方案都应该有效,但效果不佳。希望其他人能够提出一个聪明,可扩展的答案。