如何为每个团队选择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个。
答案 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场比赛 以下是需要注意的两件事。
在您的架构中,您没有专门的团队专栏。首先,您必须让所有团队使用HomeTeam& AwayTeam专栏。
第二件事你想为每支球队获得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