2017-10-07 12 views
0

私はクローン化された結果に
私のテーブルを避けるために、私のデータベースの構造を改善しようとしている1つのデータベースに座っていると、次のようになります。複数のテーブルの処理結果 - より高速な方法がありますか?

CREATE TABLE IF NOT EXISTS `Players`(
    `ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
    `UserID` INTEGER NOT NULL UNIQUE, 
    `SteamID` TEXT NOT NULL UNIQUE, 
    `Nick` TEXT NOT NULL, 
    `KlanID` INTEGER NOT NULL, 
    `Money` INTEGER NOT NULL, 
    `Kills` INTEGER NOT NULL, 
    `Deaths` INTEGER NOT NULL, 
    `Score` INTEGER NOT NULL, 
    `PayOrNot` INTEGER NOT NULL, 
    `IsNewOne` INTEGER NOT NULL, 
    `HUDMode` INTEGER NOT NULL, 
    `HUDColors` INTEGER NOT NULL, 
    `HUDPoz1` INTEGER NOT NULL, 
    `HUDPoz2` INTEGER NOT NULL 
); 

CREATE TABLE IF NOT EXISTS `Classes` (
    `ClassID` INTEGER NOT NULL PRIMARY KEY UNIQUE, 
    `UserID` INTEGER NOT NULL, 
    `Level` INTEGER NOT NULL, 
    `Health` INTEGER NOT NULL, 
    `Intelligence` INTEGER NOT NULL, 
    `Stamina` INTEGER NOT NULL, 
    `Durability` INTEGER NOT NULL 
); 

CREATE TABLE `Equipment` (
    `ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
    `UserID` INTEGER NOT NULL, 
    `Name` TEXT NOT NULL, 
    `Type` INTEGER NOT NULL, 
    `Time` INTEGER NOT NULL, 
    `NumberOfUses` INTEGER NOT NULL 
); 

これは、カウンターストライクサーバ用に設計されたプラグインです。それは、自分のクラスを選択すること、余分な力を与える装置を受け取ること、レベリングシステムなどを追加するなどのいくつかの余分な機能を導入する。私はそこに格納されたデータのほとんどすべてを取得する必要がある。問題は、各プレイヤーの機器の量が分からないことです。したがって、私は可能な限りこれらの情報を最適なものにする方法を見つけなければなりません。

今、私のクエリは次のようになりますのために:。

SELECT DISTINCT Players.SteamID,Players.Nick,Players.KlanID,Players.Money,Players.Kills,Players.Deaths,Players.Score,Players.PayOrNot,Players.IsNew,Players.HUDMode,Players.HUDColors,Players.HUDPoz1,Players.HUDPoz2, 
       Classes.Name,Classes.Level,Classes.Health,Classes.Intelligence,Classes.Stamina,Classes.Durability, 
       Equipment.Name,Equipment.Type,Equipment.Time,Equipment.NumberOfUses 
FROM Players 
INNER JOIN Equipment ON Players.UserID = Equipment.UserID 
INNER JOIN Classes ON Equipment.UserID = Classes.UserID 
WHERE Players.UserID=%d 

Here are some sample results
(そこに言葉の一部で怖がってはいけない - 私はポーランド出身来る必要とするものが翻訳しbeedしており、

マップが変更されるたびに、各プレーヤーはこのデータを受信する必要があります+地図全体に新しいデータが存在する可能性があります。
ご覧のとおり、INNER JOIN性質のためにフィールドコピーがあります。幸いなことに、私はクラスの数を知っているので、私は結果を処理することができるので、[行%number_of_classes]行と[行< number_of_classes]行のクラスから機器を取得します。しかし、私はそれがより良くできると思う。私はそれぞれのクエリから別々に結果を得ることを考えていましたが、クエリの数は3倍になります。たぶん、私はSQL構造全体を再構築する必要がありますか?それともこれが最善の方法でしょうか?

+1

(1)あなたの質問はあまりにも複雑です。 (2)あなたのコードを読むことができません。 (3)実際に使用しているデータベースを選択します。 –

+0

完了。質問自体はかなりシンプルですが、私は自分の意図が明確であることを明確にするために説明を追加しました – MAGNET

+0

質問よりも多くを求めることは広すぎるでしょう。 (そしてあなたのマシンがどれくらい速いかは誰にも知られていません。) –

答えて

1

単一クエリの出力は、テーブルの形式をとります。つまり、固定数の列と一定数の行があります。 1つのクエリでデータを取得する場合は、表形式になるように並べ替えるだけです。参加すると、重複が発生することがあります。

しかし、単一のクエリを使用する理由はありません。 SQLiteにはクライアント/サーバの通信オーバーヘッドがないため、many small queries are just as efficientです。

関連する問題