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

时间:2014-06-08 18:18:14

标签: sql

我有一个网站记录某个视频游戏的播放时间。该表目前保存着20k玩家的名字和小时数。如果新用户输入他们的信息,我怎样才能确定他们在表格中的位置?

理想情况下,这种方法在CPU上尽可能简单,因此它可以处理流量突发,即使表增长(我假设ORDER BY不建议用于非常大的表!?)

例如,当前表:

用户//播放时数
Bob // 54
戴夫// 584
史蒂文// 63

新用户是Andy,小时数为300.我只是希望返回值'2',因为他是桌上的第二个,按照下降的小时数排序。

提前致谢!

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你可以通过使用' 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将作为职位返回' 2'来自SELECT语句,因为他在玩家列表中的小时数排名第二。

可以轻松更改上述语法,以便在整个列表中返回单行和播放器的位置。

要安抚用户质疑解决方案,请在此处查看您可以使用的最终查询。它允许您指定单个用户并按照播放时间来确定位置

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:-3)

如果我理解你,你就有一个这样简单的表:

Table(USRNAME, HOURS_PLAYED)

..并且该表中的信息是这样的:

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

此布局基本上没有任何问题,但如果要从数据库中检索“位置”,则应该添加另一个具有唯一值的列。这种列称为primary keys。 你为什么要用这个?因为关系数据库如果你把它们当作大理石袋一样对待它们是最好的。您告诉数据库您需要哪些数据,数据库引擎会为您找到它。它们基于set theory。所以你的新表应该是这样的:

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之间没有区别。只是一个没有语义含义的数字。

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