在 SQL Table 上获取多个相关计数

Getting Multiple Related Counts On SQL Table

我正在尝试统计以城市为起点和终点的所有游乐设施。

我的表格与此类似:

游乐设施:rno (int), src (from location lcode), dst (to location lcode)

位置:lcode (str), prov (str), city (str)

我想要 return 城市和省的列表,以及以该城市为 "src" 位置的游乐设施计数,以及以该城市为目的地的游乐设施计数"dst" 位置。

我试图这样建模:

SELECT
    l.city,
    l.prov,
    COUNT(rsrc.rno)
FROM
    locations l
    LEFT OUTER JOIN rides rsrc ON l.lcode = rsrc.src
GROUP BY
    l.city

这非常有效,return正确的数据集:

Calgary|Alberta|3
Edmonton|Alberta|37
Jasper|Alberta|0
Regina|Saskatchewan|1
Saskatoon|Saskatchewan|1
Vancouver|British Columbia|1

然而,当我尝试再次加入游乐设施以获取 dst 时,结果都是错误的:

SELECT
    l.city,
    l.prov,
    COUNT(rsrc.rno),
    COUNT(rdst.rno)
FROM
    locations l
    LEFT OUTER JOIN rides rsrc ON l.lcode = rsrc.src
    LEFT OUTER JOIN rides rdst ON l.lcode = rdst.dst
GROUP BY
    l.city

该查询的结果是:

Calgary|Alberta|19|21
Edmonton|Alberta|86|96
Jasper|Alberta|0|0
Regina|Saskatchewan|1|1
Saskatoon|Saskatchewan|2|2
Vancouver|British Columbia|1|3

结果对我来说没有意义,所以我假设我做的事情在逻辑上是错误的,但我不知道是什么。有人能告诉我为什么这会给我带来不希望的结果吗?

最简单的解决方案是使用 count(distinct):

SELECT l.city, l.prov,
       COUNT(DISTINCT rsrc.rno), COUNT(DISTINCT rdst.rno)
FROM locations l LEFT JOIN
     rides rsrc
     ON l.lcode = rsrc.src LEFT JOIN
     rides rdst
     ON l.lcode = rdst.dst
GROUP BY l.city, l.prov;

问题是您的联接导致了笛卡尔积。 COUNT() 只是计算匹配值的数量——但与 rscr 的匹配正乘以 rdst 发生的事情,反之亦然。