SQLITE对于表的每一行,统计其他两个表中的发生次数
我需要一些帮助来简化下面的请求,并加快执行速度。以下是我想做的: 桌面播放器idPlayer,namePlayer 包含玩家列表 表EventPVE idPlayer 每一行代表一个玩家被游戏环境杀死的事件 表EventPVP idPlayerKilled,idPlayerKiller 每行代表一名玩家杀死或被另一名玩家杀死的事件 我试着,对每个玩家来说,计算他们被环境杀死的次数,他们被一个玩家杀死的次数,以及他们杀死另一个玩家的次数。下面的请求可以工作,但速度非常慢,当然是3个子请求 你能帮我简化一下吗?我的sql很差。。。。我见过一些使用左连接的解决方案,但在我的情况下似乎不起作用。第一个左联接工作正常,但其他联接返回的计数不正确SQLITE对于表的每一行,统计其他两个表中的发生次数,sqlite,Sqlite,我需要一些帮助来简化下面的请求,并加快执行速度。以下是我想做的: 桌面播放器idPlayer,namePlayer 包含玩家列表 表EventPVE idPlayer 每一行代表一个玩家被游戏环境杀死的事件 表EventPVP idPlayerKilled,idPlayerKiller 每行代表一名玩家杀死或被另一名玩家杀死的事件 我试着,对每个玩家来说,计算他们被环境杀死的次数,他们被一个玩家杀死的次数,以及他们杀死另一个玩家的次数。下面的请求可以工作,但速度非常慢,当然是3个子请求 你能帮我
SELECT p.idPlayer, p.namePlayer,
(
SELECT COUNT(*)
FROM EventPVE pve
WHERE pve.idPlayer = p.idPlayer
) AS pveDeath,
(
SELECT COUNT(*)
FROM EventPVP pvp
WHERE pvp.idPlayerKiller = p.idPlayer
) AS pvpKills,
(
SELECT COUNT(*)
FROM EventPVP pvp
WHERE pvp.idPlayerKilled = p.idPlayer
) AS pvpDeaths
FROM Player p
这里有一个测试数据库:我认为不需要第二个表EventPVE 试试这个: 从eventpvp中选择*左键在eventpvp上加入玩家。IdLayerKilled=player.IdLayerKilled按IdLayerKilled分组
它对我有用。我没有使用您提供的数据库,而是创建了一个。查询本身已经尽可能简单了 问题是数据库必须扫描所有表以查找具有匹配的玩家ID值的行,并且必须为每个玩家执行一次 可以使用一些索引加快这些查找:
CREATE INDEX ep ON EventPVE(idPlayer);
CREATE INDEX pkiller ON EventPVP(idPlayerKiller);
CREATE INDEX pkilled ON EventPVP(idPlayerKilled);
Player和EventPVE是否都至少定义了一个索引,其中最左边的列是idplyer;EventPVP是否为idPlayerKiller和idPlayerKilled中的每一个都至少有一个这样的索引?否,EventPVE或EventPVP中没有主键或索引。不过,玩家有idPlayer作为主键。播放器表中没有重复的行,如果它有助于我共享数据库。这是一个SQLITE问题。如果它是SQLITE,为什么你要标记这个问题而不是??!这里有一个到测试数据库的链接:我不是SQLITE的专家,但是在请求中没有计数的情况下,这怎么可能工作,所以我尝试显示3个计数器:p查询的返回必须是:idPlayer | namePlayer | pveDeathCount | pvpdeathcount |pvpKillsCount@vfloyd请检查随附的图片3个计数器是什么意思我不明白。你能详细说明一下吗?好的,基本上我想计算每个玩家在表EventPVE中被idPlayer字段指向的次数,每个玩家在表EventPVP中被idPlayerKilled字段指向的次数,每个玩家在表EventPVP中被idPlayerKiller字段指向的次数。