2017-02-26 122 views
0

我会尽量以最简单的形式阐述我的问题。我正在创建一个电子商务网站,并试图为搜索结果设置过滤器。一切都很好,直到我遇到以下问题。当我尝试按id进行分组时,我将所有其他外键丢到了规格值,如果我通过获取大量结果来删除组,每个结果都包含自己的外键。 (我内心将每篇文章与各自的规格值连接起来)。因此,我的问题是如何过滤所有这些规格ID?关于多个过滤器的MySQL过滤器查询

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

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次的结果(因此GROUP BY),但是如果我不组我真的不能做任何结果集。如果我在查询中将ORS更改为ANDS,那么我什么也得不到,因为只有1个值。这是我的问题的根源。在此先感谢,对不起,如果我的问题有点糟糕的判决。

+0

请发布一个sqlfiddle,其中包含您希望查询的输出。 – 2017-02-26 19:34:54

+0

您正在使用group by by aggregation function 以及使用select * with group by没有太大意义.. 请解释一下您需要的真实结果,然后选择您想要使用的group ..最终添加一个适当的数据样本和预期的结果 – scaisEdge

回答

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中的主键。实际上,这个使用group by是由ANSI标准支持的。但是,解释标准中的语言需要理解什么是“功能依赖”。

如果您想要符合任何规范的文章,您可以使用上述查询而不使用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) 
      ); 
+0

这是完全按照我想要的,非常感谢你。 – alps