2016-08-24 5 views
0

以下の要求を簡略化して実行を高速化するには、いくつかの助けが必要です。ここで私がやろうとしているものです:テーブルの各行に対してSQLiteを実行すると、他の2つのテーブルでカウントがカウントされます

表プレーヤー(idPlayer、namePlayer) は、プレイヤーが殺されてしまったとき、各行はイベントを表し選手

表EventPVE(idPlayer) のリストが含まれていますプレイヤーは殺すか、他のプレイヤーによって殺されたときに、ゲーム環境

表EventPVP(idPlayerKilled、idPlayerKiller)によって は、各行がイベントを表し

私は各プレイヤーが環境によって殺された回数、プレイヤーによって何回殺されたのか、そして何人が他のプレイヤーを殺したのかを数えようとしています。以下のリクエストは機能しますが、非常に遅いです(もちろん3つのサブリクエスト)

簡略化してもらえますか?私は非常にSQLで悪い....私はLEFT JOINといくつかの "ソリューション"を見てきましたが、それは私の場合には動作しないようです。最初のLEFT JOINは正常に動作しますが、他のLEFT JOINは不良カウントを返します。ここで

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 

は、テストデシベルです:https://www.dropbox.com/s/tc7z1i26mumvhgm/test.db?dl=0

+0

は 'Player'と' EventPVE'それぞれが左端の列は 'idPlayer'されている少なくとも1つのインデックスが定義されていませんが。 'EventPVP'は' idPlayerKiller'と 'idPlayerKilled'のそれぞれに対して少なくとも一つのそのようなインデックスを持っていますか? – eggyal

+0

いいえ、EventPVEまたはEventPVPのいずれにもプライマリキーまたはインデックスがありません。しかし、Playerは主キーとしてidPlayerを持っています。 Playerテーブルに重複行はありません – vfloyd

+0

私がデータベースを共有することができれば助かります。それはSQLiteのものです。 – vfloyd

答えて

-1

私は第二表EventPVEの必要はありませんと思います。 eventpvpそれは私のために働いているidPlayerKilled

enter image description here

でeventpvp.idPlayerKilled = player.idPlayerグループのプレーヤーに参加左から SELECT *:

はこれを試してみてください。私はあなたが提供したデータベースを使用しなかった、私は1つを作成しました。

+0

私はSQLiteの専門家ではありませんが、これはどのように "カウント"要求に3つのカウンターを表示しようとしています:pクエリの戻り値は次のようにする必要があります。idPlayer | namePlayer | pveDeathCount | pvpDeathsCount | pvpKillsCount – vfloyd

+0

@vfloyd添付の画像をご確認ください – Wajiha

+0

3つのカウンターが何を意味するのですか?あなたは詳細を教えていただけますか? – Wajiha

0

クエリ自体は既に可能な限り簡単です。

問題は、データベースがすべてのテーブルをスキャンして、一致するプレーヤID値を持つ行を見つけなければならず、すべてのプレーヤに対してこれを1回実行する必要があるということです。

これらの検索は、いくつかのインデックスをスピードアップすることができます

CREATE INDEX ep ON EventPVE(idPlayer); 
CREATE INDEX pkiller ON EventPVP(idPlayerKiller); 
CREATE INDEX pkilled ON EventPVP(idPlayerKilled); 
関連する問題