我正在尝试计算所有从城市位置到城市位置的游乐设施。
我的表与此类似:
乘坐:rno(int),src(从位置lcode),dst(到位置lcode)
位置:lcode(str),prov(str),城市(str)
我想返回城市和省份的列表,以及以该城市为“ 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
这很完美,可以返回正确的数据集:
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
结果对我来说没有意义,因此我认为我在做逻辑上错误的事情,但我不知道该怎么做。有人可以告诉我为什么这会给我带来不希望的结果吗?
答案 0 :(得分:0)
最简单的解决方案是使用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
发生的事情,反之亦然。