2017-10-07 50 views
0

我只是想改善,以避免得到克隆的結果
我的表我的數據庫結構,它坐在一個數據庫,看起來像這樣:處理來自多個表格的結果 - 有更快的方法嗎?

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
(不要被一些的話害怕在那裏 - 我來最初來自波蘭的需要已經齋翻譯的東西,突出顯示)

每當地圖發生變化時,每個玩家都必須接收這些數據+在整個地圖中可能會有一些新的地圖。
正如你所看到的,由於INNER JOIN特性,有一些字段拷貝。幸運的是,我能夠處理結果,因爲我知道類的數量,所以我從[row%number_of_classes]行和[行< number_of_classes]行獲取設備行。但是,我覺得可以做得更好。我正在考慮分別從每個查詢中獲取結果,但這會使查詢數量增加三倍。也許我必須重建整個SQL結構?或者,這可能是最好的方式嗎?

+1

(1)你的問題太複雜了。 (2)您的代碼無法閱讀。 (3)選擇您真正使用的數據庫。 –

+0

完成。問題本身很簡單,我只是添加了一些解釋來澄清我的意圖是什麼 – MAGNET

+0

問問題不僅僅是問題太廣泛。 (沒有人知道你的機器有多快。) –

回答

1

單個查詢的輸出具有表格的形式,即具有固定數量的列和一定數量的行。 如果您想通過單個查詢獲取數據,您別無選擇,只能將其排列成表格形式。加入時,這通常會導致重複。

但沒有理由使用單個查詢。 SQLite沒有客戶端/服務器通信開銷,所以many small queries are just as efficient

相關問題