【问题标题】:Getting last records by date, but for 2 different ID's按日期获取最后记录,但针对 2 个不同的 ID
【发布时间】:2016-05-24 18:38:18
【问题描述】:

我正在尝试从名为 games 的任何给定团队的表中选择具有最后一个 gameDate、今天的 gameDate(如果存在)和下一个 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 子句的解决方案,但似乎只适用于一列。我想获得与每个团队的最后一场比赛相对应的行。例如,(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 的。感谢您的宝贵时间。

【问题讨论】:

    标签: mysql sql


    【解决方案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)
    

    【讨论】:

    • 我认为您的解决方案更接近,但它并不完全正确。如果您通过添加另一行 INSERT INTO YourTable VALUES (1, 4, '2016-05-15'); 来更改 SQL Fiddle 演示,您可以看到它返回 3 行。我认为您的解决方案之所以有效,是因为 1 和 5 在我提供的示例中只出现一次。
    • @JustinPfenning 我修改了答案并在 JOIN 中添加了另一个条件。我忘了参加最初的日期。
    猜你喜欢
    • 2014-10-27
    • 2013-10-31
    • 2010-09-28
    • 2012-11-19
    • 2015-02-18
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多