按日期获取最后的记录,但有2个不同的ID

时间:2016-05-24 18:38:18

标签: mysql sql

我正在尝试选择具有最后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的。谢谢你的时间。

1 个答案:

答案 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)