我正在尝试创建一个查询,以计算包含来自多个表的播放器的特定 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
这是返回的数据:
图中可以看到第二个玩家的propsCount和killsCount都是2,propsCount应该是1,killsCount才是合适的值。 propsCount 列与 killsCount 列匹配的任何想法?当该列的值至少为 1 并且当另一列具有更大的值时,它将匹配更大的值,这似乎会发生。
最佳答案
您应该在 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
方法更快。
关于mysql - SQL 查询没有返回正确的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52907757/