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