MYSQL查询选择排除

时间:2012-06-08 14:29:17

标签: 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

我想只选择gameId = 11的每个userId的最后一个结果 我怎样才能做到这一点?帮助PLZ。

3 个答案:

答案 0 :(得分: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 :(得分: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;

没有子查询,良好的表现,良好的学习模式:)

答案 2 :(得分: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