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

时间:2014-04-24 12:35:20

标签: php mysql sql

基本上,我们知道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,它可以是代码解决方案。

2 个答案:

答案 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;