根据日期和群组

时间:2016-08-07 00:09:53

标签: mysql sql

过去几天我一直在努力谷歌,但我找不到MS Access或MySQL所需的解决方案

我有一张足球比赛结果表,我希望根据日期将每个主队的最后5个结果拉回来。

我在MS建议的访问中试过这个,我无法让它工作如何说它应该。我对MySQL很新,并且使用下面的代码更接近但是只返回最后的结果,如果我将其更改为2,则由于Subquery返回超过1行而无法运行。我不需要确切的答案如果有人可以给我一个链接来访问Access或MySQL,我很高兴。以下是我使用的,它确实返回了最后的结果。

SELECT t1.*
FROM TBL_ALL_English_Results t1
WHERE t1.id = (SELECT t2.id
             FROM TBL_ALL_English_Results t2
             WHERE t2.Home_Team = t1.Home_Team            
             ORDER BY t2.id DESC
             LIMIT 1)

2 个答案:

答案 0 :(得分:0)

MySQL让这有点困难。可能最简单的方法是使用变量:

SELECT aer.*
FROM (SELECT aer.*,
             (@rn := if(@ht = aer.Home_Team, @rn + 1,
                        if(@ht := aer.Home_Team, 1, 1)
                       )
             ) as rn
      FROM TBL_ALL_English_Results aer CROSS JOIN
           (SELECT @ht := '', @rn := 0) params
      ORDER BY aer.Home_Team, aer.id DESC
     ) aer
WHERE rn <= 5;

答案 1 :(得分:0)

考虑使用相关计数聚合查询,该查询按DATEHOME_TEAM组计算记录的排名顺序,然后使用此排名顺序过滤查询结果。下面应该符合MySQL和MS Access,甚至SQL Server和其他方言。

SELECT t1.*
FROM TBL_ALL_English_Results t1 
INNER JOIN 
 (
   SELECT t2.Home_Team, t2.Date, 
          (SELECT Count(*) FROM TBL_ALL_English_Results sub
            WHERE t2.Date <= sub.Date 
            AND t2.Home_Team = sub.Home_Team) AS GameOrder 
   FROM TBL_ALL_English_Results As t2
  )  AS LastFiveDates 
ON t1.Date = LastFiveDates.Date
AND t1.Home_Team = LastFiveDates.Home_Team
WHERE LastFiveDates.GameOrder <= 5

虽然大多数数据库都可以运行此查询,但是如果表结果高于10,000而不是服务器级RDMS,MySQL,则性能可能会有所不同,特别是在文件级数据库MS Access中。