Sql 使用多个联接时如何正确使用COUNT()?
我有以下模式: 多个Sql 使用多个联接时如何正确使用COUNT()?,sql,postgresql,join,Sql,Postgresql,Join,我有以下模式: 多个网络研讨会实体可以有多个类别,因此出现了网络研讨会类别映射表 我需要做的是找到特定类别中最受欢迎的网络研讨会(按喜欢的数量) 为此,我编写了以下查询: 选择 webinar.id,webinar.name为“webinar”,webinar.publishat, 字符串_agg(category.name,,'按category.name排序)作为类别, 将(“like”.likeableid)计算为“likes\u count” 从…起 网络研讨会 加入webinar.i
网络研讨会
实体可以有多个类别
,因此出现了网络研讨会类别映射
表
我需要做的是找到特定类别
中最受欢迎的网络研讨会
(按喜欢的数量)
为此,我编写了以下查询:
选择
webinar.id,webinar.name为“webinar”,webinar.publishat,
字符串_agg(category.name,,'按category.name排序)作为类别,
将(“like”.likeableid)计算为“likes\u count”
从…起
网络研讨会
加入webinar.id=“like”.likeableid和“like”.likeabletype='webinar'
在webinarcategorymapping.webinarid=webinar.id上加入webinarcategorymapping
在category.id=webinarcategorymapping.categoryid上加入类别
按“like”分组。likeableid,webinar.id
有
字符串_agg(category.name,,“order by category.name”)类似于“%CategoryName%”
和计数(“like”.likeableid)>0
按计数排序(“like”.likeableid)desc;
由于category
和webinar
之间存在多对多关系,我决定使用string\u agg
将每个webinar
的所有类别合并为逗号分隔的值。这样,我就可以使用I像%search\u term%
按类别执行搜索
在like
表中,likeabletype
必须等于webinar
,并且likeableid
字段是进行like的实体的id。因此,在我的例子中,当查询like
表时,我需要使用likeabletype='webinar'
和likeableid=webinar.id
条件
问题是它给了我不正确的likes\u count
结果(我想这是由于多个连接重复了许多行)
但是,使用count(distinct“like”.likeableid)
没有帮助,因为它只为每一行提供1
为了从
likes
的count()
中获得正确的结果,我应该在查询中更改什么
我需要做的是找到一个特定类别中最受欢迎的网络研讨会(按喜欢的数量)
您可以在子查询中聚合like
s,只需对类别进行筛选:
select w.id, w.name as "webinar", w.publishat, num_likes
from webinar w join
(select l.likableid, count(*) as num_likes
from "like" l
where l.likeabletype = 'webinar'
group by l.likeableid
) l
on w.id = l.likeableid join
webinarcategorymapping wcm
on wcm.webinarid = w.id join
category c
on c.id = wcm.categoryid
where c.name = ?
order by num_likes desc;
在加入之前,您可以在子查询中按分组。不清楚
like
s如何连接到其他表。另外,您关心什么特定的类别?您的查询工作正常,但给我重复的行。如果我在第一个选择之后添加distinct
,它将正常工作。使用distinct
是获得所需结果的正确方法吗?@DenisYakovenko。我怀疑重复行是由多个类别匹配网络研讨会造成的。您可以使用相关子查询替换类别比较,方法是使用where exists
。