Подзапрос MYSQL должен возвращать несколько строк с LIMIT 5 за результат из родительского запроса

У меня есть три таблицы для моей базы данных NFL

Игроки, у которых есть идентификатор/имя игрока

stats_passing - у которого есть id игрока, game_id, ярды и приземления по игре

Игра - у которой есть дата игры

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

У меня это до сих пор:

SELECT
 p.name,
 SUM(s.yds) AS tot_yds,
 SUM(s.tds) AS tot_tds
FROM players AS p
INNER JOIN (
 SELECT
 s.id,
 s.player_id,
 s.yds,
 s.tds
 FROM stats_passing AS s
 INNER JOIN games AS g ON s.game_id = g.id
 WHERE YEAR(g.date) = 2014
 ORDER BY s.player_id, g.date DESC
 LIMIT 5) AS s ON p.id = s.player_id
ORDER BY tot_yds DESC, tot_tds DESC
LIMIT 4

Однако он возвращает только один результат.

Drew Brees, 1497, 10

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

Drew Brees, 1497, 10
Tom Brady, 1234, 9
Andrew Luck, 1123, 8
Aaron Rodgers, 1023, 7

Я работаю над этим в течение нескольких дней, и я думаю, что мои знания mysql находятся в конце. Пожалуйста помоги! Заранее спасибо!

1 ответ

Догадаться. Надеюсь, это помогает кому-то другому. Не стесняйтесь добавлять к нему, если он неэффективен.

SET @rn = 0;
SET @prev = 0;

SELECT
 name,
 tot_yds,
 tot_tds
FROM (
 SELECT
 p.name,
 SUM(s.yds) AS tot_yds,
 SUM(s.tds) AS tot_tds
 FROM players AS p
 INNER JOIN (
 SELECT
 s.id,
 s.player_id,
 s.yds,
 s.tds,
 @rn := CASE WHEN @prev = s.player_id
 THEN @rn + 1
 ELSE 1
 END AS rn,
 @prev := s.player_id
 FROM (SELECT
 st.id,
 st.player_id,
 st.yds,
 st.tds
 FROM stats_passing AS st
 INNER JOIN games AS g ON st.game_id = g.id
 WHERE YEAR(g.date) = 2014
 ORDER BY st.player_id, g.date DESC) AS s
 ) AS s ON p.id = s.player_id 
 WHERE rn <= 5
 GROUP BY p.name) AS ns
 ORDER BY tot_yds DESC, tot_tds DESC
 LIMIT 4

licensed under cc by-sa 3.0 with attribution.