Если вы просто хотите последние два раунда (подчеркните «два»), есть простой трюк. Этот трюк не распространяется на получение более двух или не последних двух записей. Для получения произвольных записей в разделе вам придется использовать оконные функции, которые более активны и поддерживаются только в более новых версиях основных модулей баз данных.
Хитрость заключается в том, чтобы самостоятельно соединить таблицу «stat» с собой по идентификатору игрока в гольф. Таким образом, вы получаете все комбинации любых двух раундов игрока в гольф, включая комбинации с одинаковым раундом:
SELECT s1.round as s1_round, s2.round AS s2_round
FROM stat s1 INNER JOIN stat s2 ON (s1.golfer_id = s2.golfer_id)
Затем вы исключаете (через предложение WHERE) комбинации, которые имеют одинаковые раунды, а также убедитесь, что эти комбинации всегда первый раунд> второй раунд. Это означает, что теперь у вас есть все комбинации любых двух раундов игрока в гольф, без дубликатов:
SELECT s1.round as s1_round, s2.round AS s2_round
FROM stat s1 INNER JOIN stat s2 ON (s1.golfer_id = s2.golfer_id)
WHERE s1.round > s2.round
Обратите внимание, что если вы выбираете только записи для конкретного игрока в гольф и сортируете DESC по двум круглым столбцам, в верхнем ряду будут последние два раунда этого игрока в гольф:
SELECT TOP 1 s1.round as s1_round, s2.round AS s2_round
FROM stat s1 INNER JOIN stat s2 ON (s1.golfer_id = s2.golfer_id)
WHERE s1.round > s2.round
ORDER BY s1.round DESC, s2.round DESC
TOP 1
является языком SQL Server для получения верхней строки. Для MySQL вам нужно использовать LIMIT 1
. Для других баз данных используйте особый способ ядра базы данных.
Однако, в этом случае вы не можете сделать это так просто, потому что вам нужны последние два раунда ВСЕХ игроков в гольф. Вы должны будете сделать больше объединений:
SELECT id,
(SELECT MAX(s1.round) FROM stat s1 INNER JOIN stat s2 ON (s1.golfer_id = s2.golfer_id)
WHERE s1.round > s2.round AND s1.golfer_id = golfer.id) AS last_round,
(SELECT MAX(s2.round) FROM stat s1 INNER JOIN stat s2 ON (s1.golfer_id = s2.golfer_id)
WHERE s1.round > s2.round AND s1.golfer_id = golfer.id) AS second_to_last_round
FROM golfer
Это даст вам два последних раунда (в двух столбцах) для каждого игрока в гольф.
Или соединение таблицы игроков в гольф с установленным временным набором из двух столбцов также должно работать:
SELECT golfer.id, MAX(r.s1_round) AS last_round, MAX(r.s2_round) AS second_to_last_round
FROM golfer INNER JOIN
(
SELECT s1.golfer_id AS golfer_id, s1.round AS s1_round, s2.round AS s2_round
FROM stat s1 INNER JOIN stat s2 ON (s1.golfer_id = s2.golfer_id)
WHERE s1.round > s2.round
) r ON (r.golfer_id = golfer.id)
GROUP BY golfer.id
Я оставляю за собой тривиальное упражнение: присоединить этот запрос к таблице турниров, чтобы получить игроков в гольф для тура PGA, и присоединить этот запрос к таблице статистики, чтобы получить результаты двух последних раундов.