SQL查询未返回正确的结果

时间:2018-10-20 16:28:14

标签: mysql sql

im试图创建一个查询,该查询对来自多个表的包含播放器特定Steamid64的行的出现进行计数。截至目前,查询未返回正确的计数。似乎如果'propsCount'为2且'killsCount'为1,则出于某种原因,killsCount将为2。似乎与该行中的最大值匹配。

以下是查询:

SELECT users.steamid64, COUNT(props.steamid64) AS propsCount, COUNT(kills.steamid64) AS killsCount, COUNT(deaths.steamid64) AS deathsCount
FROM `sl_players` AS users
            LEFT JOIN `sl_deathLogs` AS deaths ON users.steamid64 = deaths.steamid64
            LEFT JOIN `sl_killLogs` AS kills ON users.steamid64 = kills.steamid64
            LEFT JOIN `sl_propLogs` AS props ON users.steamid64 = props.steamid64
        GROUP BY users.steamid64

这是返回的数据:

Sql data

在图片中,您可以看到第二个玩家的propsCount和killsCount均为2。propsCount应该为1,而killsCount是正确的值。有什么想法为什么propsCount列与killsCount列匹配?当该列的值至少为1且另一列的值更大时,它将匹配该更大的值。

1 个答案:

答案 0 :(得分:0)

您应该在JOIN之前 进行汇总。但是,如果给定steamid64的匹配项不太大并且表格具有唯一的ID,则可以使用COUNT(DISTINCT)解决方法:

SELECT p.steamid64,
       COUNT(DISTINCT pl.id) AS propsCount,
       COUNT(DISTINCT kl.id) AS killsCount,
       COUNT(DISTINCT dl.id) AS deathsCount
FROM sl_players p LEFT JOIN
     sl_deathLogs dl
     ON p.steamid64 = dl.steamid64 LEFT JOIN
     sl_killLogs kl
     ON p.steamid64 = kl.steamid64 LEFT JOIN
     sl_propLogs pl
     ON p.steamid64 = pl.steamid64
GROUP BY p.steamid64;

我不知道表中的ID真正是什么。

一个更通用的解决方案是在进行JOIN之前先汇总或使用子查询:

select p.steamid64,
       (select count(*) from sl_propLogs pl where p.steamid64 = pl.steamid64) as propsCount,
       (select count(*) from sl_killLogs kl where p.steamid64 = kl.steamid64) as killsCount,
       (select count(*) from sl_deathLogs dl where p.steamid64 = dl.steamid64) as deathsCount
from sl_players p;

这避免了外部查询中的聚合。因此,使用适当的索引(在每个日志表中的steamid64上),它应该比JOIN方法更快。