2011-09-14 8 views
0

私は簡単なアンドロイドゲームのためのデータの簡単なテーブル(ニックネーム、スコア)を持っています。 最初は、ニックネームごとに一意の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) 

は数千のニックネームオーバー1回の使用のために完全にパフォーマンスであるべき。

これは、特定のニックネームに対して2つの同じスコアがある場合、重複して表示されますか?

+0

"これは可能ですか?"ゲームのために?私は推測している:うん! –

+0

これは動作しません。テーブルエイリアスは、sqlite.orgの[DELETE Language Spec](http://www.sqlite.org/lang_delete.html)に従ってDelete Statementでサポートされていません。テーブルエイリアスS1が不正であるため、このクエリは「スコアS1」でエラーになります。 SQLite Browserで試してみましたが、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; 

全体の提案:トラックはすべて、クエリに応じ