2014-12-09 3 views
0

Я хотел бы создать представление базы данных. У меня есть таблица, в которой хранятся записи о народах, которые в течение года решают некоторые логические примеры, и у них есть баллы за это.Выберите несколько top3 из базы данных

Мне нужно создать представление из SQL-запроса, но у меня есть проблема - мне нужно получить ТОП-3 пользователей в год по одному запросу.

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

У меня есть решатели в год, отсортированные по точкам и году. Я знаю, что мне нужно использовать лимит, но я также знаю, что мне понадобится один. Выберите больше, но я не знаю, где.

ответ

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; 
+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; 
Смежные вопросы