[英]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.