我会尽可能以最简单的形式详细阐述我的问题。我正在创建一个电子商务网站,我正在尝试为搜索结果设置过滤器。一切都很好,直到我遇到以下问题。当我尝试按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个值。这是我问题的根源。提前谢谢,对不起,如果我的问题有点不好判。
答案 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)
);