基本上,我们知道SQL IN用于替换许多OR条件(x OR y OR z)。但在这种情况下,我需要一个查询或代码解决方案来选择包含(x AND y和z)的所有行。像http://www.mobile.de/这样的东西正在使用。在他们的网站上,搜索车辆时,您选择的功能越多,获得的结果就越少。所以他们显然没有在他们的查询中使用IN。我的数据库的真正简化版本就是这个。
广告表:
--------------
| id | title |
--------------
功能表:
---------------
| id | f_name |
---------------
AdvertsFeatures表:
-------------------------------
| id | advert_id | feature_id |
-------------------------------
对于功能搜索过滤器,我使用AdvertsFeatures表执行LEFT JOIN并应用以下WHERE子句:
WHERE feature_id IN (x, y, z)
因此,出现了任何所选功能的广告。但就像我说的,我需要一个查询或代码解决方案,只获得所有但不一定只所选功能的广告。用户可以从总共约40个特征中选择任意数量的特征。这将是很多WHERE子句“AND”,我已经有很多。
我该怎么做呢?它不一定是SQL,它可以是代码解决方案。
答案 0 :(得分:2)
这是“set-within-sets”查询的示例。我喜欢使用聚合和having
子句来解决这些问题。在您的情况下,您可以这样做:
select advert_id
from AdvertsFeatures af
where feature_id in (x, y, z)
group by advert_id
having count(*) = 3;
请注意,您需要将3
更改为in
列表中的项目数。这也假设AdvertsFeatures
数据中没有重复项(否则,您只需在count(distinct featureid)
子句中使用having
。
答案 1 :(得分:0)
上面的戈登查询可以用作内联视图来获取advert_id。然后,您再次将这些advert_id与AdvertFeatures表一起加入以获取所有广告,如下所示:
SELECT af1.*
FROM AdvertsFeatures af1
INNER JOIN
(SELECT advert_id
FROM AdvertsFeatures
WHERE feature_id in (x, y, z)
GROUP BY advert_id
HAVING count(*) = 3;
) af2
ON af1.advert_id = af2.advert_id;