【发布时间】:2009-11-05 18:43:06
【问题描述】:
给定以下架构:
CREATE TABLE players (
id BIGINT PRIMARY KEY,
name TEXT UNIQUE
);
CREATE TABLE trials (
timestamp TIMESTAMP PRIMARY KEY,
player BIGINT,
score NUMERIC
);
我如何创建一个SELECT,它首先从trials 中找到最好的分数,然后从users 中加入name 字段?使用此查询后,我已经能够获得我的分数:
SELECT * FROM trials GROUP BY player ORDER BY score ASC LIMIT 10;
我返回前 10 名分数的查询如下所示:
CREATE VIEW top10place AS
SELECT player.name AS name, trial.*
FROM trials AS trial, players AS player
WHERE trial.player = player.id
AND trial.score = (
SELECT MAX(score)
FROM trials AS tsub
WHERE tsub.player = trial.player
)
ORDER BY trial.score DESC, trial.timestamp ASC
LIMIT 10;
但是当我在表中点击数千个条目时,数据库性能开始下降。我认为子查询正在扼杀我的表现。第一个查询(仅返回最高分)仍然执行得很好,所以我想知道是否有办法在选择最高分后强制执行JOIN 操作。
编辑请注意,查询将返回排名前 10 的玩家,而不仅仅是前 10 名的分数。如果同一个玩家有很多高分,他应该只在前10名中出现一次。
我使用的是 SQLite,所以它没有 SQL Server 或 MySQL 的一些扩展功能。
【问题讨论】:
标签: sql optimization sqlite join