关于多个过滤器的MySQL过滤查询

时间:2017-02-26 19:29:18

标签: mysql search

我会尽可能以最简单的形式详细阐述我的问题。我正在创建一个电子商务网站,我正在尝试为搜索结果设置过滤器。一切都很好,直到我遇到以下问题。当我尝试按ID分组时,我丢失了规范值的所有其他外键,如果我删除了组,我得到了大量的结果,每个结果都包含自己的外键值。 (我内心地将每篇文章与各自的规范值相结合)。因此,我的问题是如何过滤所有这些规范ID?

我的查询(翻译和简化)如下:

select * from article
left join article_specification on article_specification.fk_articles=article.id 
where (fk_specification_value=172 or fk_specification_value=175 or fk_specification_value=184) 
group by id order by date desc

通过运行此查询,我得到1个结果(因此分组依据),但是如果我不分组,则无法对该结果集执行任何操作。如果我在查询中将ORS更改为ANDS,我什么也得不到,因为只有1个值。这是我问题的根源。提前谢谢,对不起,如果我的问题有点不好判。

1 个答案:

答案 0 :(得分:2)

如果您想要符合所有规范的文章,您可以这样做:

select a.*
from article a join
     article_specification ars
     on ars.fk_articles = a.id 
where ars.fk_specification_value in (172, 175, 184) 
group by a.id
having count(distinct ars.fk_specification_value) = 3
order by a.date desc;

注意:一般情况下,我不鼓励select *group by一起使用。在这种情况下,它是可以的,因为a.id(可能)是article中的主键。实际上,ANSI标准支持group by的这种使用。但是,解释标准中的语言需要理解什么是"功能依赖"是

如果您想要符合任何规范的文章,您可以使用上述查询而不使用having子句。但是,exists更合适:

select a.*
from article a 
where exists (select 1
              from article_specification ars
              where ars.fk_articles = a.id  and
                    ars.fk_specification_value in (172, 175, 184) 
             );