-1

我有这个 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

我只想选择 gameId = 11 的每个 userId 的最后一个结果,我该怎么做?帮助请。

4

3 回答 3

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 示例):

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
于 2012-06-08T14:34:38.477 回答
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;

没有子查询,性能很好,学习模式很好:)

于 2012-06-08T14:34:54.147 回答
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
于 2012-06-08T14:39:32.547 回答