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