2012-06-08 112 views
-1

我有這樣的MySQL表(分):MySQL查詢選擇排除

id userId gameId score1 score2 idPaisesL idPaisesV 
59 1  11  1  1  229   173 
57 1  11  1  0  229   173 
58 1  11  2  1  229   173 
56 1  11  2  2  229   173 
53 1  11  7  7  229   173 
52 1  11  3  5  229   173 
51 3  11  6  6  229   173 
50 3  11  6  6  229   173 
49 3  11  5  5  229   173 
48 1  11  5  0  229   173 
47 1  11  2  3  229   173 
46 1  11  1  0  229   173 
23 1  1  5  3  173   52 
54 1  11  2  0  229   173 

我想只選擇遊戲ID每用戶id的最後結果= 11 我怎樣才能做到這一點?幫助PLZ。

+0

我希望MySQL支持窗口化函數。 –

+2

大多數人會使用選擇查詢,但這只是一個猜測......顯示你的嘗試,我們會盡力幫助解決它。我們不會爲你寫全部內容。 –

+0

[你有什麼嘗試?](http://www.whathaveyoutried.com/) –

回答

1

也許這樣的事情:

SELECT 
    * 
FROM 
    scores AS t 
    JOIN 
     (
      SELECT 
       MAX(t2.id) AS maxID 
      FROM 
       scores AS t2 
      GROUP BY 
       t2.userId 
     ) AS Latest 
     ON t.id=Latest.maxID 
WHERE 
    t.gameId=11 
+0

不錯!非常感謝! – user995691

+0

沒問題。很高興幫助:P – Arion

1

我假設這裏id總是對新條目和「最後結果」提高爲最高id進入該用戶/遊戲組合:

SELECT * 
FROM scores a 
WHERE gameId = 11 
    AND id = (
    SELECT MAX(id) 
    FROM scores b 
    WHERE a.userId = b.userId 
     AND a.gameId = b.gameId 
) 

這可能不是最高效,因爲根據我的經驗,MySQL往往會遇到子查詢問題。


如果您正在使用其他數據庫有OLAP功能,你可以做喜歡的事,所以(sqlfiddle example):

SELECT * 
FROM (SELECT s.*, 
      ROW_NUMBER() OVER (PARTITION BY userID, gameID ORDER BY id DESC) AS RN 
     FROM scores s) 
WHERE RN=1 
    AND gameID=11 
1

如果「最後一個」你想讓你的具有最高ID:

SELECT * 
FROM scores s1 
LEFT JOIN scores s2 ON s1.userId = s2.userId AND s1.id < s2.id 
WHERE s2.id IS NULL 
    AND gameId = 11; 

無子查詢,不錯的性能,良好格局學習:)

+1

這是一個很好的模式,永遠不會想到這一點,即使我現在還記得幾年前做這件事,現在只是總是比較容易想到子查詢 – Woody