SQL - 多选过滤器:组合过滤条件以获得正确的结果



我正在研究一个过滤器,用户可以在其中为最终输出选择不同的条件。现在我正在构造SQL查询,但是每当选择更多条件时,它都不起作用。

广告值表的示例。

+----+-----------+---------------+------------+
| id | listingId | value         | identifier |
+----+-----------+---------------+------------+
| 1  | 1a        | Alaskan Husky | race       |
+----+-----------+---------------+------------+
| 2  | 1a        | Højt          | activity   |
+----+-----------+---------------+------------+
| 3  | 1c        | Akita         | race       |
+----+-----------+---------------+------------+
| 4  | 1c        | Mellem        | activity   |
+----+-----------+---------------+------------+

如您所见,每个广告价值都有不同的行。

我期待的结果

假设用户选中/勾选了显示"阿拉斯加哈士奇"的比赛复选框,那么它应该返回比赛的listingId(一次(。如果用户已选择"阿拉斯加雪橇犬"和活动级别为"低",则它应该不返回任何内容,如果活动级别为"Mellem"或"Højt"(中,高(,则它应返回 listingId,其中种族仅为"阿拉斯加雪橇犬",而不是"秋田"。我希望你明白我想要完成什么。

我尝试了这样的东西,什么也没返回。

SELECT * FROM advalues WHERE (identifier="activity" AND value IN("Mellem","Højt")) AND (identifier="race" AND value IN("Alaskan Husky"))

顺便说一下,我也想选择不同的列表 Id,所以它只返回唯一的列表 Id。

我将继续四处寻找解决方案,过去几个小时我一直在这样做,但也想在这里发布,因为我还没有找到任何对我有帮助的东西。谢谢!

您可以针对每种类型将标识符的保留拆分为两个表。然后你加入列表ID以获得具有两种类型的标识符的列表Id。

SELECT ad.listingId
FROM   advalues ad
JOIN   advalues ad2
ON ad.listingId = ad2.listingId
WHERE ( ad.identifier  = 'activity' AND ad.value  IN( 'Mellem', 'Højt' ) )
AND  ( ad2.identifier = 'race'     AND ad2.value IN( 'Alaskan Husky' ) ) 

这个问题并不完全清楚,但我认为你想要这个:

WHERE (identifier="activity" AND value IN("Mellem","Højt")) OR (identifier="race" AND value IN("Alaskan Husky"))

如果我猜对了,您正在尝试使用不同的"过滤器"获取数据。

您的查询

SELECT listingId FROM advalues 
WHERE identifier="activity" 
AND value IN("Mellem","Højt") 
AND identifier="race" 
AND value IN("Alaskan Husky")

将始终返回 0 个结果,因为您要求identifier = "activity" AND identifier = "race"

我想你想做这样的事情:

SELECT listingId FROM advalues 
WHERE 
(identifier="activity" AND value IN("Mellem","Højt"))
OR 
(identifier="race" AND value IN("Alaskan Husky"))

最新更新