2010-05-05 77 views
1
一個等級

我的表結構是這樣的:SQL查詢:最後但用戶

create table rankings (
    id IDENTITY NOT NULL, 
    user_id INT NOT NULL, 
    game_poule_id INT NOT NULL, 
    rank INT NOT NULL, 
    insertDate DATETIME NOT NULL, 
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, 
    FOREIGN KEY (game_poule_id) REFERENCES game_poules(id) ON DELETE CASCADE 
    ); 

每個遊戲用戶的所有舊的排名都保存在這個表中。現在我想在表格中爲遊戲中的所有用戶提供最後一個排名。

有人想法如何實現這個?謝謝

+0

請郵寄到現在爲止您編寫的代碼。人們通常不喜歡只爲你寫代碼。 – 2010-05-05 08:58:03

+0

我現在有一個GROUP BY子句 SELECT user_id,rank FROM排名WHERE FK_gamePoule =? GROUP BY USER_ID 但下一步是比較困難的:-) – Derk 2010-05-05 09:01:09

回答

0

您需要自己加入表格才能獲取所需的記錄。 對於這個答案我創建你的表時沒有外鍵,因爲它們不需要讓它工作。

CREATE TABLE Rankings (
    id int IDENTITY NOT NULL, 
    user_id INT NOT NULL, 
    game_poule_id INT NOT NULL, 
    rank INT NOT NULL, 
    insertDate DATETIME NOT NULL 
    ); 

插入一些示例數據。沒有更多的信息,我無法模擬比這更好的任何信息。

INSERT Rankings(user_id,game_poule_id,rank,insertDate) 
VALUES(1, 100, 3, CURRENT_TIMESTAMP-2) 
INSERT Rankings(user_id,game_poule_id,rank,insertDate) 
VALUES(1, 100, 2, CURRENT_TIMESTAMP-1) 
INSERT Rankings(user_id,game_poule_id,rank,insertDate) 
VALUES(1, 101, 6, CURRENT_TIMESTAMP) 
INSERT Rankings(user_id,game_poule_id,rank,insertDate) 
VALUES(2, 100, 5, CURRENT_TIMESTAMP-2) 
INSERT Rankings(user_id,game_poule_id,rank,insertDate) 
VALUES(2, 100, 1, CURRENT_TIMESTAMP-1) 
INSERT Rankings(user_id,game_poule_id,rank,insertDate) 
VALUES(2, 101, 2, CURRENT_TIMESTAMP) 

查詢過去,但一個等級

SELECT Rankings.game_poule_id, Rankings.user_id, rank, MAX(Rankings.insertDate) 
FROM Rankings INNER JOIN 
    (SELECT game_poule_id, user_id, MAX(insertDate) max_insert_date 
     FROM rankings 
     GROUP BY game_poule_id, user_id) Max_Ranking_Date 
ON Rankings.user_id = Max_Ranking_Date.user_id 
    AND Rankings.insertDate < Max_Ranking_Date.max_insert_date 
    AND Rankings.game_poule_id = Max_Ranking_Date.game_poule_id 
GROUP BY Rankings.game_poule_id, Rankings.user_id, rank 

請注意! 正如您從結果中可以看到的,您不會爲每個用戶只有一行的遊戲獲得排名。但是因爲你要求的是「最後一個」,這對於有多個條目的遊戲纔有意義。

編輯: 我剛剛意識到我提供的查詢不會爲每個用戶每場比賽返回一行。任何人都想解決它?我得與一些工作:)

+0

感謝,我也有另一個查詢 選擇 * FROM 排名 [R WHERE \t FK_gamePoule = 0和 r.insertDate = COALESCE( (SELECT r2.insertDate FROM 排名R2 WHERE r.FK_user = r2.FK_user ORDER BY r2.insertDate DESC LIMIT 1 OFFSET 1), '2048年12月31日23時59分59秒') 但是,如果你的是更好的我會用它:-) – Derk 2010-05-05 15:15:06

+0

@Derk,你是否設法讓你的查詢工作?我沒有時間再看看它。 – Tony 2010-05-18 10:09:04

0

另一個可能的(不太好)解決方案

SELECT 
    * 
FROM 
    rankings r 
WHERE 
    FK_gamePoule = 0 AND 
    r.insertDate = COALESCE(
    (SELECT 
     r2.insertDate 
    FROM 
     rankings r2 
    WHERE 
     r.FK_user = r2.FK_user ORDER BY r2.insertDate DESC 
    LIMIT 1 
    OFFSET 1), '2048-12-31 23:59:59')