mysql - SQL 查询没有返回正确的结果

标签 mysql sql

我正在尝试创建一个查询,以计算包含来自多个表的播放器的特定 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 并且当另一列具有更大的值时,它将匹配更大的值,这似乎会发生。

最佳答案

您应该在 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/

相关文章:

mysql - 获取不同的值mysql

sql - PLS-00103 : Encountered the symbol "end-of-file" when expecting one of the following:

java - JDBC程序创建两个不同的连接

mysql - UncategorizedSQLException 将文本直接从文本文件保存到数据库时出现不正确的字符串值错误?

php - 如何将.frm文件传输到表?

mysql - 多个外键 OR 关系

mysql - 如何从以逗号分隔值存储的 MySQL 中选择当前周工作日期

SQL Server - 在存储过程中选择 * 与选择列

c# - 我可以从 NHibernate 获取底层连接和事务对象吗?

python - 根据 Django 中相关字段的计数进行排序