我有一個包含足球結果的MySQL數據庫,並且只想檢索該數據的特定子集。獲取MySQL數據庫中每個團隊的最後6條記錄
的數據由含MatchDate,HomeTeam,AwayTeam,HomeGoals一個表,AwayGoals
我怎樣才能獲取該數據包含在過去的6場比賽,各隊已經參與的一個子集?
雖然我可以爲單個團隊做到這一點,但我如何獲得包含表格中每個團隊最近6場比賽的單個子集? (我不擔心該子集可能包含一些重複項)。
我有一個包含足球結果的MySQL數據庫,並且只想檢索該數據的特定子集。獲取MySQL數據庫中每個團隊的最後6條記錄
的數據由含MatchDate,HomeTeam,AwayTeam,HomeGoals一個表,AwayGoals
我怎樣才能獲取該數據包含在過去的6場比賽,各隊已經參與的一個子集?
雖然我可以爲單個團隊做到這一點,但我如何獲得包含表格中每個團隊最近6場比賽的單個子集? (我不擔心該子集可能包含一些重複項)。
這裏有一種方法用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
這裏是從小提琴的更新:
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
我會使用類似:雖然你真的應該使用
使用(較新的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自動遞增主鍵,它會幫助你很多。
'LIMIT 'IN'子查詢內不允許。 –
新增版本無'in' –
括號缺失或某些行未被複制粘貼。 –
你的問題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
你是對的 - 這不是關於主場或客場球隊,而是關於數據集中任何球隊發揮的最後6場比賽。然而,我不確定查詢是在做什麼,但是在我的數據集上運行10分鐘後它還沒有返回(數據包含超過400個團隊的結果,可以延伸多年) – phrenetic
@phrenetic。 。 。我做了一個小改動,因此它收到了最近的6次。比賽桌有多大?即使是幾千行,10分鐘似乎也是如此。 –
@phrenetic。 。 。試圖做這個相關的子查詢看起來像一場噩夢。替代方案是可變計數器方法並使用臨時表。我更新了改進版本。 –
http://stackoverflow.com/questions/134958/get-top-results-for-each-group-in-oracle – dugas