Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Nedd有助于理解为什么只有带有子查询的联接才能返回正确的值_Mysql_Sql - Fatal编程技术网

Mysql Nedd有助于理解为什么只有带有子查询的联接才能返回正确的值

Mysql Nedd有助于理解为什么只有带有子查询的联接才能返回正确的值,mysql,sql,Mysql,Sql,我对SQL非常陌生,需要帮助才能理解为什么值变化如此之大。我想JOIN的概念我还不太清楚 我有两张桌子: 桌上游戏(id、帐户id、游戏日期、游戏id) 表报告(id、罪犯id、报告日期、评论) 我想得到所有被报告的数量,他们玩的游戏总数和他们被报告的百分比 我能设法得到正确的答案。只需要帮助理解为什么第二个查询工作,而第一个查询返回不正确的值 第一个问题: SELECT j.account_id, COUNT(j.account_id) AS Total_Games_Playe

我对SQL非常陌生,需要帮助才能理解为什么值变化如此之大。我想JOIN的概念我还不太清楚

我有两张桌子: 桌上游戏(id、帐户id、游戏日期、游戏id) 表报告(id、罪犯id、报告日期、评论)

我想得到所有被报告的数量,他们玩的游戏总数和他们被报告的百分比

我能设法得到正确的答案。只需要帮助理解为什么第二个查询工作,而第一个查询返回不正确的值

第一个问题:

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 ;

两个输出的链接:

这可能是因为
报告
游戏
之间存在一对多关系。因此,如果您在加入后计数,则记录将被复制,复制的记录将被计数


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

问题在于
COUNT()
只是计算列中非空值的数量。因为
j.account\u id
r.accounter\u id
可能不是
NULL
,所以得到相同的计数。如果您在运行查询时不使用
分组依据(
选择*
很好),以查看
联接产生的结果,您将更好地理解这一点

您可以使用
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
放在了错误的位置(如果没有示例数据,很难设置查询逻辑)。

第一个我忘记将表名更改为(games g),因为我使用的是我的母语名称。srry查询仍然返回重复的值。数据也有点混乱,对不起。每个帐户id条目代表一个不同的游戏。主键是“id”,因此如果我计算每个帐户的id条目,它应该返回玩过的游戏总数