2011-09-14 35 views
0

我有一个简单的Android游戏简单的数据表(昵称,分数)。 最初我没有为每个昵称设置一个唯一的ID,现在我有多个来自同一个昵称的条目。sqlite整合查询

我现在要做的是通过从相同的昵称中删除“额外”条目并保持各自的高分来巩固数据。

我试图做一个查询,但没有成功。

你有什么建议来实现我所需要的结果?

回答

0

试试下面的(我没有一个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) 

应该是一次性使用几千个绰号的完美表现。

如果给定的昵称有两个相同的分数,这会给你带来重复,这可能吗?

+0

“这可能吗?”对于一款游戏?我猜测:是! –

+0

这不起作用,根据sqlite.org上的[DELETE Language Spec](http://www.sqlite.org/lang_delete.html),Delete语句不支持表别名。这个查询在'Scores S1'出错,因为表别名S1是非法的。我已经在SQLite浏览器中试过了,它在S1中给出了一个错误。 – danishgoel

+0

对不起,在我现在使用的计算机上没有SQLite或任何工具。我正在编辑提供一个等效的命令,没有根据规范应该*有效的别名,但如果你真的这么友好,我会请你测试它。 –

1

如何创建一个新表并使用此查询添加条目。

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; 
+0

这可能是一个选项,但我会清除源表并将数据从“结果”表中复制回来,因为表名是在游戏中硬编码的。 – BrainCrash

1

我想你想这样做:

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; 

总体建议:多事,查询相应