我会尽力以最简单的形式阐述我的问题。我正在创建一个电子商务网站,并且正在尝试为搜索结果设置过滤器。一切都很好,直到我遇到以下问题。当我尝试按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个值。那是我问题的根源。谢谢,对不起,如果我的问题有些判决有些不好。
如果您想要符合所有规格的文章,则可以这样做:
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)
);