2013-03-30 84 views
3

我有一個包含足球結果的MySQL數據庫,並且只想檢索該數據的特定子集。獲取MySQL數據庫中每個團隊的最後6條記錄

的數據由含MatchDate,HomeTeam,AwayTeam,HomeGoals一個表,AwayGoals

我怎樣才能獲取該數據包含在過去的6場比賽,各隊已經參與的一個子集?

雖然我可以爲單個團隊做到這一點,但我如何獲得包含表格中每個團隊最近6場比賽的單個子集? (我不擔心該子集可能包含一些重複項)。

+0

http://stackoverflow.com/questions/134958/get-top-results-for-each-group-in-oracle – dugas

回答

2

這裏有一種方法用user-defined variable做到這一點:

select MatchDate, HomeTeam, AwayTeam, HomeGoals, AwayGoals 
from (
    select 
    MatchDate, HomeTeam, AwayTeam, HomeGoals, AwayGoals, 
    @teamCounter:=IF(@prevHome=HomeTeam,@teamCounter+1,1) teamCounter, 
    @prevHome:=HomeTeam 
    from yourtable 
    join (select @teamCounter:=0) t 
    order by HomeTeam, MatchDate desc 
) t 
where teamCounter <= 6 

SQL Fiddle Demo

這裏是從小提琴的更新:

select team, MatchDate, HomeTeam, AwayTeam, HomeGoals, AwayGoals 
from (
    select 
    team, yourtable.MatchDate, HomeTeam, AwayTeam, HomeGoals, AwayGoals, 
    @teamCounter:=IF(@prevHome=team,@teamCounter+1,1) teamCounter, 
    @prevHome:=team 
    from yourtable 
    join (
     select distinct matchdate, hometeam team 
     from yourtable 
     union 
     select distinct matchdate, awayteam 
     from yourtable 
    ) allgames on yourtable.matchdate = allgames.matchdate 
     and (yourtable.hometeam = allgames.team or yourtable.awayteam = allgames.team) 
    join (select @teamCounter:=0) t 
    order by team, yourtable.MatchDate desc 
) t 
where teamCounter <= 6 
order by team 

Updated SQL Fiddle

+0

Downvoter,謹慎解釋? – sgeddes

+0

我不確定這是否符合我的預期,因爲它似乎會爲每支球隊產生超過6場比賽。 (在結果集中第一隊列出了19場比賽) – phrenetic

+0

@phrenetic - 你看到小提琴嗎?那爲每支球隊挑選了6個?你能否更新一些樣本數據產生不正確的結果? – sgeddes

0

我會使用類似:雖然你真的應該使用

使用(較新的MySQL)

select *,HomeTeam AS HOME from myTable 
where HomeTeam in 
    (select HomeTeam from myTable 
    where Hometeam = HOME 
    order by created_date limit 6) 
group by HomeTeam 

沒有(舊的MySQL)

select * from myTable t1 
where HomeTeam IN 
    (select HomeTeam from myTable t2 
    where t2.HomeTeam = t1.HomeTeam 
     order by created_date 
     limit 6) 
group by t1.HomeTeam 

說明和標籤帶ID在這裏。

如果還沒有,該表應該有一個主鍵。理想地稱爲ID或[table_name] _id。這將使您能夠使用此ID進行子選擇和聯接。永遠不要認爲記錄將是唯一的。作爲一種慣例,使用ID自動遞增主鍵,它會幫助你很多。

+0

'LIMIT 'IN'子查詢內不允許。 –

+0

新增版本無'in' –

+0

括號缺失或某些行未被複制粘貼。 –

3

你的問題ISN特別是關於主隊還是aw唉團隊,所以我假設一場比賽可以有兩個。

下面的查詢將得到前六場比賽,不管他們打其中:

select MatchDate, HomeTeam, AwayTeam, HomeGoals, AwayGoals 
from (select m.*, 
      (select count(*) 
       from matches m2 
       where (m.hometeam = m2.hometeam or m.hometeam = m2.awayteam) and 
        m.matchdate <= m2.matchdate 
      ) GameCounter 
     from matches m 
    ) m 
where GameCounter <= 6 

它使用相關子查詢拿到了賽。

對於性能,我放棄了相關子查詢的想法。這是從@sgeddes借用想法爲組內的計數:

 select m.* 
     from (select team, matchdate, 
        @teamCounter:=IF(@prevTeam=Team, @teamCounter+1,1) as teamCounter, 
        @prevTeam:=Team 
      from ((select m.hometeam as team, m.* 
        from matches m 
        group by h.hometeam 
       ) union all 
        (select m.awayteam as team, m.* 
        from matches m 
        group by m.awayteam 
       ) 
       ) m cross join 
       (select @teamCounter:=0) const 
      group by team 
      order by team, matchdate desc 
      ) m 
        where TeamCounter <= 6 
+0

你是對的 - 這不是關於主場或客場球隊,而是關於數據集中任何球隊發揮的最後6場比賽。然而,我不確定查詢是在做什麼,但是在我的數據集上運行10分鐘後它還沒有返回(數據包含超過400個團隊的結果,可以延伸多年) – phrenetic

+0

@phrenetic。 。 。我做了一個小改動,因此它收到了最近的6次。比賽桌有多大?即使是幾千行,10分鐘似乎也是如此。 –

+0

@phrenetic。 。 。試圖做這個相關的子查詢看起來像一場噩夢。替代方案是可變計數器方法並使用臨時表。我更新了改進版本。 –

相關問題