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