id | team_name
---------------
123 Lag 1
125 Lag 2
126 Lag 3
150 Lag 4
220 Lag 5
321 Lag 6
Kan man på ett smidigt sätt göra en SQL som plockar ut följande resultat?:
place | team_name
---------------
1 Lag 1
2 Lag 6
3 Lag 2
4 Lag 5
5 Lag 4
En match kan aldrig sluta oavgjort så det kommer det inte bli nåra problem med.
Använder MSSQL 2000, kanske kan använda "user defined functions" till det på nåt sätt?
Grejen är den att man innan matcherna spelas ska kunna definera vilka som kommer vart i slutplaceringen. Man kan ju gå den långa vägen och kolla varje rad i placeringslistan och då kolla vilket lag som har fler mål än det andra i match-tabellen osv. Men OM det går att lösa på ett smidigare sätt vore det ju kanon!
select p.place
, l.team_name
from placering p
inner
join match m
on p.game_id = m.game_id
inner
join lag l
on l.id = case
when p.win_loose = 'winner' then m.home_team
else m.away_team
end
order
by p.place
Jag förstär inte vad den första tabellen har för funktion.
För att få fram lagen sorterat med avseende på antal vinster
select team_name,
(select count(*)
from games
where (home_team = t.id
and home_goals > away_goals)
or (away_team = t.id
and away_goals > home_goals)) as wins
from teams t
order by win desc
Den första tabellen har till funktion att definera placeringar i en turnering. Den som vinner match (game_id) 903 är alltså etta (1), tvåan är förloraren i samma match osv.
Detta ska göras så att man allt eftersom matcherna spelas klart ska kunna se på vilken plats respeltive lag kommer på.
Det är alltså ingen vanlig serie med en tabell utan utslagsmatcher som spelas. Därav denna placeringslista.
select p.place
, l.team_name
from placering p
join match m
on p.game_id = m.game_id
join lag l on l.id =
case when (p.win_loose = 'winner' and home_goals > away_goals)
or (p.win_loose = 'looser' and home_goals < away_goals) then
m.home_team
else m.away_team
end
order by p.place
Jag kom precis fram till en lösning, men den kanske är sämre än den du (LarsG) föreslog?
Fördelar/nackdelar med den jag gjort?
select p.place
, l.team_name
from placering p
inner join match m
on p.game_id = m.game_id
inner join lag l on l.id =
case when p.win_loose = 'winner' AND m.home_goals > m.away_goals then m.home_team
when p.win_loose = 'looser' AND m.home_goals < m.away_goals then m.home_team
else m.away_team
end
order by p.place