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
这是返回的数据:
在图片中,您可以看到第二个玩家的propsCount和killsCount均为2。propsCount应该为1,而killsCount是正确的值。有什么想法为什么propsCount列与killsCount列匹配?当该列的值至少为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
方法更快。