MySQL: ограничение количества записей, возвращаемых для каждого игрока в наборе результатов. - PullRequest
0 голосов
/ 20 июня 2020

Как я могу изменить следующий запрос, чтобы ограничить результаты таким образом, чтобы для каждого человека отображались только две игры, а не четыре?

Это позволит мне легче ответить на вопрос, в каких двух играх есть каждая из этих людей играли совсем недавно? Или аналогичные вопросы с большими наборами, где много записей возвращается для каждого человека.

Я использую следующий SQL в MySQL через phpMyAdmin, чтобы вернуть список игр для группы из нескольких человек, которые отвечают на вопрос, для этой группы людей, в какие игры они играли в последнее время?

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

playgroup.Fullname - это таблица, в которой есть четыре человека, для которых я хочу создать список.

Запрос

SELECT Games.Title, playgroup.FullName, Max(Responses.PlayDate)

FROM (Players INNER JOIN (Games INNER JOIN Responses ON Games.ID = Responses.Title) ON Players.ID = Responses.Player) INNER JOIN PlayGroup ON Players.ID = PlayGroup.FullName

GROUP BY Games.Title, PlayGroup.FullName

ORDER BY playgroup.FullName ASC, Max(Responses.PlayDate) DESC;

Текущие результаты

Какое изменение запроса может привести к тому, что для каждого FullName будут возвращены только две игры?

Title,
FullName,
Max(Responses.PlayDate)

Dutch Blitz
1
2020-06-14 00:00:00.000000

PitchCar
1
2020-06-13 00:00:00.000000

Bohnanza
1
2020-05-31 00:00:00.000000

Geocaching
1
2020-05-25 00:00:00.000000

Patchwork
2
2020-05-26 00:00:00.000000

Dominion
2
2020-05-25 00:00:00.000000

Geocaching
2
2020-05-25 00:00:00.000000

Disc Golf
2
2020-05-24 00:00:00.000000

Dutch Blitz
4
2020-06-14 00:00:00.000000

Bohnanza
4
2020-05-31 00:00:00.000000

Ingenious
4
2020-04-28 00:00:00.000000

Qwirkle
4
2020-04-08 00:00:00.000000

Colossal Arena
141
2020-06-19 00:00:00.000000

Roll for the Galaxy
141
2020-06-18 00:00:00.000000

Fortnite
141
2020-06-16 00:00:00.000000

Pendragon
141
2020-06-15 00:00:00.000000

1 Ответ

0 голосов
/ 20 июня 2020

Вы можете использовать оконные функции:

SELECT title, fullname, max_playdate
FROM (SELECT g.Title, pg.FullName, Max(r.PlayDate) as max_playdate,
            ROW_NUMBER() OVER (PARTITION BY g.Title ORDER BY MAX(r.PlayDate) DESC) as seqnum
      FROM Players p INNER JOIN
           Games g INNER JOIN
           Responses r
           ON r.ID = r.Title JOIN
           Players p
           ON p.ID = r.Player INNER JOIN
           PlayGroup pg
           ON p.ID = pg.FullName    
      GROUP BY g.Title, pg.FullName
     ) g
ORDER BY FullName ASC, max_PlayDate DESC;
...