用于获取列匹配(x AND y AND z)的所有行的查询或代码解决方案


A query or code solution for getting all rows where a column matches (x AND y AND z)

基本上,我们知道SQL IN用于替换许多OR条件(x OR y OR z)。但在这种情况下,我需要一个查询或代码解决方案来选择包含(x AND y AND z)的所有行。类似于http://www.mobile.de/正在使用。在他们的网站上,当搜索车辆时,你选择的功能越多,得到的结果就越少。所以他们在查询中显然没有使用IN。我的数据库的简化版本是这样的。

广告表:

--------------
| id | title |
--------------

功能表:

---------------
| id | f_name |
---------------

广告功能表:

-------------------------------
| id | advert_id | feature_id |
-------------------------------

对于功能搜索过滤器,我使用AdvertsFeatures表进行LEFT JOIN,并应用以下WHERE子句:

WHERE feature_id IN (x, y, z)

因此,出现了具有任何所选特征的广告。但是,正如我所说,我需要一个查询或代码解决方案,它只获得具有所有但不一定只有所选功能的广告。用户可以从总共大约40个特征中选择任意数量的特征。这将是很多WHERE子句"AND",我已经有很多了。

我该怎么做?它不一定是SQL,它可以是一个代码解决方案。

这是一个"集中的集合"查询的例子。我喜欢使用聚合和having子句来解决这些问题。在你的情况下,你可以这样做:

select advert_id
from AdvertsFeatures af
where feature_id in (x, y, z)
group by advert_id
having count(*) = 3;

请注意,您需要将3更改为in列表中的项目数。这还假设AdvertsFeatures数据中没有重复项(否则,您只需在having子句中使用count(distinct featureid))。

Gordon上面的查询可以用作内联视图来获取advertise_id。然后,您将这些advertise_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;