2013-04-17 78 views
0

我正在一個CodeIgniter後端的遊戲,用戶信息和高分表被保存在數據庫中。每個用戶只能進入他的個人最好成績高分,所以只有每用戶與INNER JOIN的位置在第二個表

現在我需要導出數據爲客戶這樣他就可以隨機挑選一個贏家單個條目。 基本上我想給他所有的用戶數據加上用戶點和他在高分表中的位置。

我在搞清楚如何獲得高分表中的位置問題。

比方說,我的用戶表看起來像這樣

user_table 
| id|name| 
|...| ...| 

highscore_table 
|id |user_id|points| 
|...| ... | ... | 

SQL語句,不包括高分位置,看起來像這樣

SELECT user_table.id, name, points 
FROM user_table 
INNER JOIN highscore_table ON user_table.id = highscore_table.user_id 
ORDER BY name 

導出的數據應該是這樣的

|id | name|points|hs_position| 
|...| ... | ... | ... | 

通常當我要求高分,我做同樣的事情,但通過012對數據進行排序。這不是一個選項。

有人能告訴我如何實現這一目標,導致我在正確的方向,或只是簡單明瞭的告訴我,這是不可能的?

任何幫助,非常感謝。

+3

什麼是你的DBMS? –

+0

你正在做什麼? – Duk

+0

這是SQLite嗎? –

回答

1

如果您使用的是不支持排名函數(如SQLite的)一個RDBMS,那麼實現這一目標的一個方法是通過一個子查詢 - 像這樣:

SELECT u.id, u.name, h.points, 
     (select count(*) + 1 
     from highscore_table h2 
     WHERE h2.points > h.points) hs_position 
FROM user_table u 
INNER JOIN highscore_table h ON u.id = h.user_id 
ORDER BY u.name 

SQLFiddle here

(如果你想有一個密集排列的高分,更改count(*) + 1count(distinct h2.points) + 1

2

我在解決如何獲得 高分表中的位置時遇到問題。

如果您在使用SQL-Server,您可以使用DENSE_RANK爲HS-等級和ROW_NUMBER每個用戶的最高點,以獲得該行:

WITH cte 
    AS (SELECT user_table.id, 
       name, 
       points, 
       hs_position=Dense_rank() 
           OVER( 
           ORDER BY points DESC), 
       Personalbest_Num=Row_number() 
            OVER( 
            partition BY id 
            ORDER BY points DESC) 
     FROM user_table 
       INNER JOIN highscore_table 
         ON user_table.id = highscore_table.user_id) 
SELECT id, 
     name, 
     points, 
     hs_position 
FROM cte 
WHERE personalbest_num = 1 
ORDER BY hs_position ASC, 
      name ASC 
0

這是MySQL的解決方案:

SELECT user_table.id, name, points, hs_table.rank 
FROM user_table 
INNER JOIN 
(
    SELECT hs.*, IF(@prev != points, @pos:[email protected] + 1, @pos) as rank 
    , @prev:=points 
    FROM highscore_table hs, 
     (SELECT @pos:=0, @prev:=NULL) vars 
    ORDER BY points DESC 
) hs_table 
ON user_table.id = hs_table.user_id 
ORDER BY name 

具有相同點數的人將具有相同的等級。