2015-03-23 4 views
0

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

Итак, ниже приведены самые последние игры для Суонси, как дома, так и вне дома, как мне получить его для всех команд?

select d.date, d.hometeam, d.awayteam 
    from dump d 
    where 
    d.hometeam = 'Swansea' 
    or d.awayteam ='Swansea' 
    order by STR_TO_DATE(date, '%d/%m/%Y') desc limit 6 

Для примера данных, которые у меня есть. Я использую данные CSV, представленные в football-data.co.uk: http://www.football-data.co.uk/mmz4281/1415/E0.csv

Я использую MySQL, однако, если есть функция или хранимая процедура, которую вы считаете идеальной для этой цели, я могу использовать SQL Server.

Edit: Ожидаемый результат

X  | Date | Home Team | Away Team 
---------------------------------------- 
Swansea| 23/03/15|Swansea |Arsenal 
---------------------------------------- 
Swansea| 14/03/15|Man City |Swansea 
---------------------------------------- 
Man Utd| 14/03/15|Man Utd |Man City 
---------------------------------------- 
Man Utd| 14/03/15|Man Utd |Liverpool 

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

Куда левая команда, о которой идет речь, поскольку приведенная выше таблица показывает 2 за команду, я пытаюсь получить 6 за команду.

+1

Вы используете 'MySQL' или' SQLServer'? – NickyvV

+0

В настоящее время я использую MySQL, но я тоже могу использовать SQLServer без проблем. –

+0

Пожалуйста, для получения ответов выберите ** one **. – tadman

ответ

1

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

  1. В вашей схеме у вас нет конкретной колонки для команды. Поэтому сначала вы должны получить всю команду, используя столбцы AwayTeam HomeTeam &.

  2. 2-я вещь, которую вы хотите получить 6 самых последних игр для каждой команды. Средства внутри группы команд вы должны делать, но mysql не поддерживает функцию ранжирования. Хотя у нас есть альтернатива для ранжирования функций.

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

SELECT 
r.homeTeamOrAwayTeam AS team 
, r.date 
, r.hometeam 
, r.awayteam 
-- , r.rank 
FROM (
SELECT 
    d.date, 
    d.hometeam, 
    d.awayteam, 
    subQuery.homeTeamOrAwayTeam, 
    CASE WHEN @runningElement = subQuery.homeTeamOrAwayTeam THEN @groupRank := (@groupRank + 1) 
     ELSE @groupRank := 1 
    END AS rank 
    , CASE WHEN @runningElement = subQuery.homeTeamOrAwayTeam THEN @runningElement := subQuery.homeTeamOrAwayTeam 
     ELSE @runningElement := subQuery.homeTeamOrAwayTeam 
    END AS runnigElement 
FROM 
    dump d 
JOIN (
    -- to get all the hometeam & awayteam in one column 
    SELECT d.hometeam AS homeTeamOrAwayTeam FROM DUMP AS d 
    UNION 
    SELECT d.awayteam AS homeTeamOrAwayTeam FROM dump AS d 
) AS subQuery 
    ON d.hometeam = subQuery.homeTeamOrAwayTeam OR d.awayteam = subQuery.homeTeamOrAwayTeam, 
-- for ranking purpose 
(SELECT @groupRank := 1) a, 
(SELECT @runningElement := '') b 
ORDER BY 
    subQuery.homeTeamOrAwayTeam, 
    STR_TO_DATE(d.date, '%d/%m/%Y') 
) as r 
-- set your criteria (e.g. if want to get only 6 results per team) 
WHERE r.rank between 1 and 6 
+0

Привет Раушан, отличный ответ! Однако он не возвращает 6 результатов за команду, он возвращает все. Есть идеи? Кажется, что ранг не увеличивается. –

+0

Когда я выводя Rank, он равен 0 для каждой строки. –

+0

Привет, Jezzabeanz, ранг увеличивался с 0, но был некоторый логический недостаток. Я обновил запрос. Попробуй это сейчас. Вы можете попробовать его здесь: [http://sqlfiddle.com/#!9/8c8a0/4] –

2

Вам просто нужно GROUP BY команды и дата:

SELECT d.team, d.date, d.hometeam, d.awayteam 
FROM dump d 
GROUP BY team, date 
ORDER BY STR_TO_DATE(date, '%d/%m/%Y'); 
+0

О, боже, мой разум ушел. Вы не поверили бы, что я написал отчет по SQL для жизни в прошлом году, не так ли? Хах. Спасибо user4035 –

Смежные вопросы