Nedd帮助理解为什么只有带子查询的JOIN返回正确的值

时间:2016-11-20 16:30:40

标签: mysql sql

我对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

2 个答案:

答案 0 :(得分:0)

可能是因为reportsgames之间存在一对多关系。因此,如果您在Join之后计算,那么记录将被复制并且重复的记录将被计算在内。

但是在第二个查询中,您首先计算offender_id表中的reports并加入结果,这将避免重复,这与第一个查询不同

答案 1 :(得分:0)

问题是COUNT(<col>)只计算列中非NULL值的数量。由于j.account_idr.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置于错误的位置(如果没有样本数据,可能很难设置查询逻辑)。