从数据库中选择多个top3

时间:2014-12-09 12:36:08

标签: mysql sql

我想创建一个数据库视图。我有桌子,其中包含有关人民的记录,在一年中解决了一些合乎逻辑的例子,他们得到了积分。

我需要从SQL查询创建视图,但我遇到了问题 - 我需要每年通过一次查询获得TOP 3用户。

SELECT solver, year, SUM(points) as TotalPoints
FROM solving
GROUP BY solver, year 
ORDER BY year, TotalPoints DESC

我每年按照分数和年份排序。我知道我需要使用限制,但我也知道我需要一个选择更多,但我不知道在哪里。

2 个答案:

答案 0 :(得分:0)

这可能会帮助你。

SELECT solver,
    year,
    SUM(points) AS TotalPoints
FROM (
    SELECT solver,
        year,
        SUM(points) AS TotalPoints
    FROM solving
    ORDER BY year,
        TotalPoints DESC
    )
WHERE rownum <= 3
ORDER BY year,
    TotalPoints DESC;

答案 1 :(得分:0)

在MySQL中有几种方法可以解决这个问题。可能最有效的是使用变量。以下列举了值:

SELECT yt.*,
       (@rn := if(@y = year, @rn + 1,
                  if(@y := year, 1, 1)
                 )
       ) as seqnum
FROM (SELECT solver, year, SUM(points) as TotalPoints
      FROM solving
      GROUP BY solver, year
     ) yt CROSS JOIN
     (SELECT @y := 0, @rn := 0) vars
ORDER BY year, TotalPoints DESC;

然后使用它作为子查询来获得前三名:

SELECT yt.*
FROM (SELECT yt.*,
             (@rn := if(@y = year, @rn + 1,
                        if(@y := year, 1, 1)
                       )
             ) as seqnum
      FROM (SELECT solver, year, SUM(points) as TotalPoints
            FROM solving
            GROUP BY solver, year
           ) yt CROSS JOIN
           (SELECT @y := 0, @rn := 0) vars
      ORDER BY year, TotalPoints DESC
     ) yt
WHERE seqnum <= 3;
相关问题