为每个团队选择前x个记录

时间:2015-03-23 20:15:54

标签: mysql sql

如何为每个团队选择x最近的记录,Home and Away?

所以下面的内容让我了解斯旺西最近的主场和客场比赛,我如何为所有球队得到它?

    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

有关我所拥有数据的示例。我使用的是football-data.co.uk提供的CSV数据:http://www.football-data.co.uk/mmz4281/1415/E0.csv

我正在使用MySQL但是如果有一个功能或存储过程,你觉得这个目的是理想的,我可以使用SQL Server。

修改:预期输出

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个。

2 个答案:

答案 0 :(得分: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');

答案 1 :(得分:1)

您希望所有团队分别获得最近的6场比赛 以下是需要注意的两件事。

  1. 在您的架构中,您没有专门的团队专栏。首先,您必须让所有团队使用HomeTeam& AwayTeam专栏。

  2. 第二件事你想为每支球队获得6场最近的比赛。团队中你意味着排名,但mysql不支持排名功能。虽然我们可以选择排名功能。

  3. 根据我的分析,这里是查询。请试一试。

    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