Как выбрать AVG из TOP n сгруппированных значений в MySQL? - PullRequest
2 голосов
/ 27 января 2011

База данных:

player  |  team  |  points  
player1 | team1  |  100
player2 | team1  |  90
player3 | team2  |  100
player4 | team2  |  95
player5 | team2  |  90

Я пытаюсь получить 2 лучших игрока по очкам каждой команды и усреднить их по рейтингу команд, группируя команды по запросу:

team2 97.5 (not 95)
team1 95


       `$mysqli->query("SELECT charGuild, gr FROM (
        SELECT charGuild, AVG(charRating) as gr 
        FROM ins_rated 
        GROUP BY charGuild 
        HAVING COUNT(*) >= 10
        ORDER BY gr DESC
        LIMIT 15
        )
       ORDER BY gr DESC
       LIMIT 40");`

Не работает должным образом.

$mysqli->query("SELECT charGuild, AVG(charRating) AS gr 
                                        FROM ins_rated 
                                        GROUP BY charGuild 
                                        HAVING COUNT(*) >= 10
                                        ORDER BY gr DESC
                                        LIMIT 40");

Перечисляет лучшие команды, в состав которых входит не менее 10 человек. Теперь я могу потерять только 15 лучших игроков, чтобы усреднить результаты команд.

Ответы [ 4 ]

2 голосов
/ 27 января 2011
SELECT charGuild, AVG(charRating) as gr FROM ins_rated GROUP BY charGuild order by gr desc limit 2 
0 голосов
/ 27 января 2011

Мне нравится этот: у него нет недостатков в моих двух других ответах ...

SELECT charGuild, AVG(charRating) average
FROM (
    SELECT
        charRating,
        charGuild,
        @num := IF(@guild = charGuild, @num + 1, 1) AS row_number,
        @guild := charGuild
    FROM ins_rated a
        ORDER BY charGuild DESC
) ordered
WHERE row_number <= 2
GROUP BY charGuild;

Вывод:

charGuild     average
team 1        95.0000         
team 2        97.5000      
0 голосов
/ 27 января 2011

Woohoo!

SELECT charGuild, AVG(charRating) average
FROM (SELECT charRating, charGuild FROM ins_rated a ORDER BY charRating DESC LIMIT 4) top4
GROUP BY charGuild

Выходы:

charGuild           average  
team 1              95.0000  
team 2              97.5000  

РЕДАКТИРОВАТЬ: поцарапать это. Предполагается, что количество команд известно, и в каждой команде есть как минимум 2 человека.

0 голосов
/ 27 января 2011

Код ошибки: 1235 Эта версия MySQL еще не поддерживает подзапрос «LIMIT & IN / ALL / ANY / SOME»

Я думаю, вам может понадобиться немного кодирования.

Лучшее, что я мог сделать, это:

SELECT charGuild, charRating
FROM ins_rated a
WHERE charRating = (SELECT MAX(charRating) FROM ins_rated b WHERE b.charGuild = a.charGuild)
OR charRating = (SELECT MAX(charRating) FROM ins_rated b WHERE b.charGuild = a.charGuild
    AND charRating < (SELECT MAX(charRating) FROM ins_rated c WHERE c.charGuild = a.charGuild));

выходы:

charGuild     charRating   
team 1        100          
team 1        90           
team 2        100          
team 2        95           

РЕДАКТИРОВАТЬ: поцарапать это. Он получает 2 самых высоких уникальных балла. Если 2 игрока в команде наберут 100, он выберет не (100 100) как наивысший результат, а (100,95).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...