我只是想改进我的数据库结构,以避免获得克隆结果 我的表位于一个数据库中,看起来像这样:
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]行获取了Equipment,从[row< number_of_classes]行。但是,我觉得它可以做得更好。我正在考虑单独从每个查询中获取结果,但它会使查询数量增加三倍。也许我必须重建整个SQL结构?或者这可能是最好的方法吗?
答案 0 :(得分:1)
单个查询的输出具有表的形式,即,它具有固定数量的列和特定数量的行。 如果您想通过单个查询获取数据,则别无选择,只能将其排列为表格形式。加入时,这通常会导致重复。
但没有理由使用单个查询。 SQLite没有客户端/服务器通信开销,因此many small queries are just as efficient。