我有一个简单的Android游戏简单的数据表(昵称,分数)。 最初我没有为每个昵称设置一个唯一的ID,现在我有多个来自同一个昵称的条目。sqlite整合查询
我现在要做的是通过从相同的昵称中删除“额外”条目并保持各自的高分来巩固数据。
我试图做一个查询,但没有成功。
你有什么建议来实现我所需要的结果?
我有一个简单的Android游戏简单的数据表(昵称,分数)。 最初我没有为每个昵称设置一个唯一的ID,现在我有多个来自同一个昵称的条目。sqlite整合查询
我现在要做的是通过从相同的昵称中删除“额外”条目并保持各自的高分来巩固数据。
我试图做一个查询,但没有成功。
你有什么建议来实现我所需要的结果?
试试下面的(我没有一个SQLite安装在此刻,以测试相关子查询的确切语法):
DELETE FROM Scores WHERE EXISTS
(SELECT * FROM Scores S2
WHERE S2.nickname = nickname AND S2.score > score)
或(这是正确的,以感谢测试danishgoel在下面的评论)
DELETE FROM Scores WHERE EXISTS
(SELECT * FROM Scores S2
WHERE S2.nickname = Scores.nickname AND S2.score > Scores.score)
应该是一次性使用几千个绰号的完美表现。
如果给定的昵称有两个相同的分数,这会给你带来重复,这可能吗?
如何创建一个新表并使用此查询添加条目。
INSERT INTO newscorestable(nickname, score)
SELECT nickname, max(score)
FROM oldscorestable GROUP BY nickname
并删除旧表
此查询集应该这样做(假设原始表名是分数)。
CREATE TABLE scores2 AS
SELECT nickname, max(score) as score FROM scores GROUP BY nickname;
DELETE FROM scores;
INSERT INTO scores SELECT nickname, score FROM scores2;
DROP TABLE scores2;
/* to free unused space */
VACUUM;
这可能是一个选项,但我会清除源表并将数据从“结果”表中复制回来,因为表名是在游戏中硬编码的。 – BrainCrash
我想你想这样做:
create table temptable (nickname varchar(50), score int);
insert into temptable (nickname, score)
select nickname, max(score)
from yourtable
group by nickname;
delete from yourtable;
insert into yourtable (nickname, score)
select nickname, max(score)
from temptable;
然而,如果我是你,我就不会删除该分数。您可以跟踪每个分数,然后查询您想要的内容。
想要获得前10名的高分吗?这里:
select nickname, score
from yourtable
order by score desc
limit 10
想要每个用户的高分?在这里:
select nickname, max(score)
from yourtable
group by nickname;
总体建议:多事,查询相应。
“这可能吗?”对于一款游戏?我猜测:是! –
这不起作用,根据sqlite.org上的[DELETE Language Spec](http://www.sqlite.org/lang_delete.html),Delete语句不支持表别名。这个查询在'Scores S1'出错,因为表别名S1是非法的。我已经在SQLite浏览器中试过了,它在S1中给出了一个错误。 – danishgoel
对不起,在我现在使用的计算机上没有SQLite或任何工具。我正在编辑提供一个等效的命令,没有根据规范应该*有效的别名,但如果你真的这么友好,我会请你测试它。 –