繁体   English   中英

SQL-根据值将行插入表中,然后确定表中的位置

[英]SQL- insert row into table based on value, then determine position in table

我有一个网站,记录某个电子游戏的播放时间。 该表当前保存着2万名玩家的名字和游戏时间。 如果有新用户输入他们的信息,我如何确定他们在表中的位置?

理想情况下,这种方法在CPU上尽可能地容易,这样它就可以处理突发流量,即使表增长了(我认为对于大表也不建议使用ORDER BY!)

例如,当前表:

用户//玩了几个小时
鲍勃// 54
戴夫// 584
史蒂文// 63

新用户是Andy,玩的小时数为300。我只是想返回值“ 2”,因为他是桌上的第二个,按播放的小时数递减。

提前致谢!

语法会因所使用的数据库服务器(MySQL,Oracle,Microsoft SQL Server)而异,但是所有现代RDBMS的支持索引都以某种方式出现。 通过构造适当的索引(然后在适当的硬件上进行调整),即使在大型表上,ORDER BY子句或窗口函数也是完全可以接受的。

您可以使用“ RANK”功能来实现:

这是一个如何使用Microsoft SQL Server的快速示例:

--Create an example of your table
CREATE TABLE #HoursPlayed
(
    vchName VARCHAR(255),
intHoursPlayed INT
)

--Add in the initial daa
INSERT #HoursPlayed VALUES ('Bob', 54), ('Dave', 584), ('Steven', 63)

--Now add in Andy
INSERT #HoursPlayed VALUES ('Andy', 300)

--Now see where Andy fits in the list ordered by hours played
SELECT RANK()OVER(ORDER BY hp.intHoursPlayed desc) Position, *
FROM #HoursPlayed hp

Andy将在SELECT语句中返回位置“ 2”,因为他在玩家列表中所玩的小时数排名第二。

可以很容易地更改以上语法,以返回单行和播放器在整个列表中的位置。

为了使用户对解决方案提出疑问,这是您可以使用的最终查询。 它将允许您指定一个用户,并按照玩时数获得排名

SELECT *
FROM 
(
   SELECT RANK()OVER(ORDER BY intHoursPlayed desc) Position, *
   FROM #HoursPlayed
) hp
WHERE hp.vchName = 'Andy'

请注意,使用子查询对大型数据集可能有害。

select count(1) + 1 as Place
from Players
where HoursPlayed > (select HoursPlayed from Players where UserName = @UserName)

如果我理解正确,您将有一个简单的表格,如下所示:

Table(USRNAME, HOURS_PLAYED)

..该表中的信息如下:

"Bob", 54
"Dave", 584
"Steven", 63

这种布局基本​​上没有错,但是如果您要从数据库中检索“位置”,则实际上应该添加具有唯一值的另一列。 这种列称为主键 为什么要使用这个? 因为如果将关系数据库当作大理石袋一样对待,则关系数据库最有效。 您告诉数据库所需的数据,然后数据库引擎为您找到它。 它们基于集合论 因此,您的新表应如下所示:

Table(ID, USRNAME, HOURS_PLAYED)
1, "Bob", 54
2, "Dave", 584
3, "Steven", 63

这将是这样做的“正确”方法,或者通常被表述为:最佳实践。

可以的,但是我强烈建议您不要使用它。 MS SQL和其他数据库引擎不符合ROW_NUMBER()的概念。 当您从表中SELECT数据时,服务器将在2D表中检索数据。 如果返回的行,SQL引擎能够计算索引(不一定是表中的实际位置!!!) 请参考以下链接: http : //msdn.microsoft.com/en-us/library/ms186734.aspx

因此,想象这样的查询:

SELECT USRNAME, HOURS_PLAYED FROM Table WHERE USRNAME='Bob';

该查询将返回正确的记录,但是您不知道位置。 如果您使用ID列,那将很简单。

SELECT ID, USRNAME, HOURS_PLAYED FROM Table WHERE USRNAME='Bob'; 

该查询将返回数字1。

但是请记住,数据库引擎不在乎记录的位置。 因此,数据库本身在ID = 3和ID = 23454之间没有区别。 只是一个没有语义含义的数字。

我建议您阅读数据库设计基础知识,您将能够很快解决其余与数据库有关的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM