Связи в Зале Славы (групповой игрок, максимальный уровень и максимальный счет за каждую игру, когда месяц ...) - PullRequest
0 голосов
/ 01 июня 2018

Необходимо перечислить Зал славы лучших игроков, база данных содержит каждого отдельного игрока в разных играх.

Уровень имеет приоритет, если уровень одинаковый, проверьте самый высокийсчет.

У меня есть база данных с user_id, уровнем, счетом, игрой и данными.Схема здесь:

CREATE TABLE IF NOT EXISTS `docs` (`user_id` int(6) unsigned NOT NULL,
`level` int(3) unsigned NOT NULL,`game` varchar(30) NOT NULL,
`score` int(5) unsigned NOT NULL,
`data` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `docs` (`user_id`, `level`, `game`, `score`,`data`) VALUES
  ('1', '7', 'pacman', '8452','2018-02-14 15:00:00'),
  ('1', '9', 'pacman', '9999','2018-02-10 16:30:00'),
  ('2', '8', 'pacman', '8500','2018-02-24 17:30:00'),
  ('1', '10', 'pacman', '9100','2018-02-15 18:30:00'),
  ('1', '10', 'pacman', '8800','2018-02-15 18:11:00'),
  ('1', '11', 'snake', '9600','2018-02-14 15:00:00'),
  ('1', '6', 'snake', '7020','2018-02-11 11:30:00'),
  ('2', '8', 'snake', '8500','2018-02-24 14:00:00'),
  ('2', '12', 'snake', '9200','2018-02-25 19:00:00'),
  ('2', '12', 'snake', '9800','2018-02-25 19:20:00'),
  ('1', '4', 'pacman', '2452','2018-03-11 15:00:00'),
  ('1', '6', 'pacman', '4999','2018-03-07 16:30:00'),
  ('2', '7', 'pacman', '5500','2018-03-02 17:30:00'),
  ('1', '7', 'pacman', '5100','2018-03-01 18:30:00'),
  ('1', '3', 'snake', '3600','2018-03-03 15:00:00'),
  ('1', '5', 'snake', '4220','2018-03-01 11:30:00'),
  ('2', '5', 'snake', '3900','2018-03-04 14:00:00'),
  ('2', '5', 'snake', '5200','2018-03-05 19:00:00');

Я хочу получить зал славы для выбранного месяца и игры, например, если я выберу pacman на март результат должен быть:

user level score
2     7    5500
1     7    5100

я попробовал это как предложить в другой похожей теме

select d1.*
from docs d1 
left outer join docs d2
on (d1.user_id = d2.user_id and d1.level < d2.level)
where d2.user_id is null
order by level desc;

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

здесь есть SQL Fiddle

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

после долгой работы, изучения и исследования это лучшее решение для меня:

SELECT user_id, level, score, game
  FROM (
            SELECT *, 
                   @rn := IF(user_id = @g, @rn + 1, 1) rn, 
                   @g := user_id
              FROM (select @g := null, @rn := 0) x, 
                   docs where game='pacman'
          ORDER BY user_id, level desc, score desc, game
       ) X
 WHERE rn = 1 order by level desc, score desc;

объяснение в этой теме Выберите одно значение из группы на основе порядка из других столбцов

0 голосов
/ 01 июня 2018
SELECT x.* FROM docs x
JOIN 
(select user_id
      , game
      , MONTH(data) month
      , MAX(score) score
   from docs 
  where game = 'pacman' 
    and MONTH(data) = 3 
  group 
     by user_id
      , game
      , MONTH(data)
 ) y
 ON y.user_id = x.user_id
 AND y.game = x.game
 AND y.month = MONTH(x.data)
 AND y.score = x.score;

или что-то в этом роде

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