mysql ВЫБРАТЬ лучших из каждой категории в одной таблице - PullRequest
2 голосов
/ 17 февраля 2012

Допустим, у меня есть стол под названием Gamers. Геймеры содержит столбцы GamerID, GameID, Score.

Мне интересно выбрать игрока с наибольшим количеством очков в каждой игре.

Например,

|Gamers
|-------------------------
|GamerID | GameID | Score
|1       | 1      | 10
|2       | 1      | 10
|3       | 1      | 10
|4       | 1      | 90
|5       | 2      | 40
|6       | 2      | 10
|7       | 3      | 10
|8       | 3      | 30

После запроса я надеюсь получить строки для GamerID 4, 5 и 8. Какой запрос это сделает?

Ответы [ 5 ]

6 голосов
/ 17 февраля 2012

Попробуйте это:

SELECT gamers.*
FROM gamers
INNER JOIN 
 (SELECT 
   max(score) as maxscore, 
   gameid from gamers
   GROUP BY gameid) AS b
ON (b.gameid = gamers.gameid AND b.maxscore=gamers.score) ;
ORDER BY score DESC, gameid;

Будет выведено:

+---------+--------+-------+
| gamerid | gameid | score |
+---------+--------+-------+
|       4 |      1 |    90 |
|       5 |      2 |    40 |
|       8 |      3 |    30 |
+---------+--------+-------+
3 rows in set (0.00 sec)

Другой вариант, который вы можете сделать, - создать временную таблицу или представление (если вам не нравится подзапрос).

create temporary table games_score (
 SELECT max(score) as maxscore, gameid FROM gamers GROUP BY gameid
);

Тогда:

SELECT gamers.* 
FROM gamers 
INNER JOIN games_score AS b ON (b.gameid = gamers.gameid AND b.maxscore=gamers.score) 
ORDER BY score DESC, gameid;

ИЛИ представление:

create or replace view games_score AS 
SELECT max(score) as maxscore, gameid FROM gamers GROUP BY gameid;

Тогда:

SELECT gamers.* 
FROM gamers 
INNER JOIN games_score AS b ON (b.gameid = gamers.gameid AND b.maxscore=gamers.score) 
ORDER BY score DESC, gameid;
5 голосов
/ 17 февраля 2012

Попробуйте это:

select g1.* from gamers g1
left join gamers g2
on g1.gameId = g2.gameId and g1.score < g2.score
where g2.score is null

Результат с учетом предоставленных данных:

+---------+--------+-------+
| GAMERID | GAMEID | SCORE |
+---------+--------+-------+
|       4 |      1 |    90 |
|       5 |      2 |    40 |
|       8 |      3 |    30 |
+---------+--------+-------+
4 голосов
/ 17 февраля 2012

попробуйте это:

SELECT a.GameID, a.GamerID, a.Score
FROM Gamers a INNER JOIN
    (
        SELECT s.GameID, MAX(s.Score) AS Maxx
        FROM Gamers s
        GROUP BY s.GameID
    ) b ON (a.GameID = b.GameID) AND (a.Score = b.Maxx) 
ORDER BY GameID;
2 голосов
/ 17 февраля 2012

Вы можете сделать это с помощью дополнительного выбора, как показано ниже:

SELECT GameID, GamerID, Score
FROM Gamers
WHERE Score = (
     SELECT
     MAX(scores.Score)
     FROM Gamers AS scores
     WHERE scores.GameID = Gamers.GameID
)
GROUP BY GameID

Проверено на:

CREATE TABLE Gamers (
  GamerID int(11) NOT NULL,
  GameID int(11) NOT NULL,
  Score int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO Gamers (GamerID, GameID, Score) VALUES
(1, 1, 10),
(2, 1, 10),
(3, 1, 10),
(4, 1, 90),
(5, 2, 40),
(6, 2, 10),
(7, 3, 10),
(8, 3, 10);

Конечно, это не будет идеально в ситуациях, когда два игрокадобиться того же результата для данной игры.

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