我对SQL很陌生,需要帮助才能理解为什么值变化太大。我想JOIN概念对我来说还不是很清楚。
我有两张桌子: 桌上游戏(id,account_id,game_date,game_id) 表格报告(id,offender_id,reported_date,comment)
我希望得到所有报道的数据,他们玩的总比赛数以及他们被报道的百分比
我可以设法得到正确的答案。只需要帮助理解为什么第二个查询有效,第一个查询返回错误的值
首先查询:
SELECT
j.account_id,
COUNT(j.account_id) AS Total_Games_Played,
COUNT(r.offender_id) AS Total_Reports,
COUNT(j.account_id) AS Total_Games,
COUNT(r.offender_id)/ COUNT(j.account_id) AS PCG_Games_Reporte
FROM jogos j
JOIN reports r
ON j.account_id = r.offender_id
GROUP BY j.account_id
ORDER BY Total_Games_Played DESC ;
第二次查询
SELECT
g.account_id,
r.Total_Reported,
COUNT(g.account_id) AS Total_Games,
r.Total_Reported/ COUNT(g.account_id) AS PCG_Games_Reported
FROM games g
JOIN (
SELECT
offender_id,
COUNT(offender_id) AS Total_Reported
FROM reports
GROUP BY offender_id
) r
ON g.account_id = r.offender_id
GROUP BY g.account_id
ORDER BY Total_Reported DESC ;
两个输出的链接:http://imgur.com/gallery/UBqkg
答案 0 :(得分:0)
可能是因为reports
和games
之间存在一对多关系。因此,如果您在Join
之后计算,那么记录将被复制并且重复的记录将被计算在内。
但是在第二个查询中,您首先计算offender_id
表中的reports
并加入结果,这将避免重复,这与第一个查询不同
答案 1 :(得分:0)
问题是COUNT(<col>)
只计算列中非NULL值的数量。由于j.account_id
和r.offender_id
- 可能 - 不是NULL
,因此您获得的计数相同。如果您在没有GROUP BY
的情况下运行查询(SELECT *
很好),您将会更好地理解这一点,以查看JOIN
产生的结果。
您可以使用COUNT(DISTINCT)
执行所需操作。我认为这是逻辑:
SELECT j.account_id, COUNT(j.account_id) AS Total_Games_Played,
COUNT(r.offender_id) AS Total_Reports,
COUNT(DISTINCT j.account_id) AS Total_Games,
COUNT(r.offender_id) / COUNT(DISTINCT j.account_id) AS PCG_Games_Reporte
FROM jogos j JOIN
reports r
ON j.account_id = r.offender_id
GROUP BY j.account_id
ORDER BY Total_Games_Played DESC ;
我可能将DISTINCT
置于错误的位置(如果没有样本数据,可能很难设置查询逻辑)。