我正在尝试选择具有最后gameDate,今天的gameDate(如果存在)的行,以及来自任何给定团队的名为games的表的下一个gameDate。它的结构如下:
awayTeam homeTeam gameDate
1 2 5/12/16
2 3 5/13/16
3 5 5/14/16
2 4 5/14/16
我面临的问题是teamID可以出现在两列中 - awayTeam或homeTeam。我看到很多解决方案都有group by子句,但它们似乎只适用于一列。我想获得对应于每个团队的最后一个gameDate的行。例如,(1,5)将返回:
awayTeam homeTeam gameDate
1 2 5/12/15
3 5 5/14/16
由于我想要最近的游戏,从今天开始的任何游戏,以及下一个游戏,我认为解决这个问题的最佳方法是首先获取过去的行,然后使用今天日期的行加入UNION ALL,然后UNION ALL与下一场比赛。这个表很小,只有大约3,000行。我有以下查询,但它只适用于homeTeam而不是它出现在awayTeam中。此外,下面的查询需要2.2秒,对于行数如此之少的表来说,这看起来非常高。
SELECT g . *
FROM games g
WHERE g.gameDate = (
SELECT MAX( g2.gameDate )
FROM games g2
WHERE g2.homeTeam = g.homeTeam
AND gameDate < NOW( )
AND g.homeTeam
IN (1, 5) )
ORDER BY g.gameDate DESC
我想过可能会把它分成一个视图,所以我可以很容易地得到一个团队最后一次玩,无论他们是出现在homeTeam还是awayTeam专栏,但这看起来有点过分。这是针对MySQL的。谢谢你的时间。
答案 0 :(得分:1)
这不是很漂亮,但它可能对你有帮助。最内部派生的表将日期中的所有团队放在一列中。下一部分让每支球队最后一场比赛的日期。将其加入到原始表格中,现在您将以原始格式返回每个团队的最新游戏。解释起来很困惑,但如果你从内到外逐一运行每个选项,那真的很简单。
<强> SQL Fiddle Demo 强>
SELECT yt.*
FROM
(SELECT
Team
, MAX(GameDate) AS GameDate
FROM
(SELECT AwayTeam AS Team, GameDate
FROM YourTable
UNION ALL
SELECT HomeTeam AS Team, GameDate
FROM YourTable) a
WHERE GameDate < NOW()
GROUP BY
Team) MaxDates
JOIN YourTable yt ON (MaxDates.Team = yt.AwayTeam OR MaxDates.Team = yt.HomeTeam)
AND yt.GameDate = MaxDates.GameDate
WHERE MaxDates.team in (1,5)