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

Php 用于获取列匹配的所有行(x、y和z)的查询或代码解决方案,php,mysql,sql,Php,Mysql,Sql,基本上,我们知道中的SQL用于替换许多OR条件(x、y或z)。但在本例中,我需要一个查询或代码解决方案来选择包含(x、y和z)的所有行。类似的东西正在使用。在他们的网站上,搜索车辆时,选择的功能越多,得到的结果就越少。所以他们显然没有在他们的查询中使用。我的数据库的一个真正简化版本是这样的 广告表: -------------- | id | title | -------------- 功能表: --------------- | id | f_name | ---------------

基本上,我们知道中的SQL用于替换许多OR条件(x、y或z)。但在本例中,我需要一个查询或代码解决方案来选择包含(x、y和z)的所有行。类似的东西正在使用。在他们的网站上,搜索车辆时,选择的功能越多,得到的结果就越少。所以他们显然没有在他们的查询中使用。我的数据库的一个真正简化版本是这样的

广告表:

--------------
| id | title |
--------------
功能表:

---------------
| id | f_name |
---------------
-------------------------------
| id | advert_id | feature_id |
-------------------------------
广告功能表:

---------------
| id | f_name |
---------------
-------------------------------
| id | advert_id | feature_id |
-------------------------------
对于features search filter,我与Advertises features表进行左连接,并应用以下WHERE子句:

WHERE feature_id IN (x, y, z)
因此,出现具有任何选定功能的广告。但正如我所说,我需要一个查询或代码解决方案,只获取包含所有但不一定只有选定功能的广告。用户可以从总共约40个功能中选择任意数量的功能。这将是很多WHERE子句和,我已经有很多了

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

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

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

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

Gordon的上述查询可用作获取广告id的内联视图。然后,再次将这些广告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;

但这是否意味着查询将只获取只有这些选定功能而没有其他功能的广告。我希望我的查询能够得到包含所有但不一定只有选定功能的广告。如果我的原始问题不清楚,很抱歉。@Alternatex。这就是这个查询的作用。不考虑x、y和z以外的特征。哦。。我一定是被搞糊涂了。谢谢你的帮助。