簡體   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