webForumDet fria alternativet

Funktion för att plocka ut vinnare/förlorare

Databaser & SQL

11 svar · 450 visningar · startad av Obbelix

Medlem sedan okt. 2002257 inlägg
Frågan#1

En helg-nöt:

Ska skapa en slutplaceringslista utifrån vinnare/förlorare i matcher.

Tabellen ser ut som följer:

place | win_loose | game_id
---------------------------
1       winner      903
2       looser      903
3       winner      902
4       looser      902
5       winner      837

Sen har jag en tabell med alla matcher:

game_id | home_team | away_team | home_goals | away_goals
---------------------------------------------------------
903       123         321         3            2
902       125         220         5            1
837       126         150         0            4

Och tabellen som håller reda på lagen:

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?

Medlem sedan juli 20033 147 inlägg
#2

Borde väl funka med något liknande

select
   sp.place,
   l.team_name
from
   slutplacering sp
left join
   matcher m on sp.game_id = m.game_id
left join
   lagen l on m.home_team = l.id

/red

Nehedu, det där funkar inge vidare ser jag nu.
Återkommer!

Medlem sedan juli 20033 147 inlägg
#3

Uhm, du får nog bygga om din databasstruktur, där du har lagets id i placeringstabellen.

Medlem sedan okt. 2002257 inlägg
#4

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!

Medlem sedan dec. 20025 483 inlägg
#5

Jag är osäker på om man kan göra så här:

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
Medlem sedan okt. 2002257 inlägg
#6

Nja. Det kanske är en bra början, men på nåt ställe måste ju home_goals jämföras med away_goals så man vet vilket lag som vunnit.

Medlem sedan dec. 200012 464 inlägg
#7

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
Medlem sedan okt. 2002257 inlägg
#8

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.

Medlem sedan dec. 200012 464 inlägg
#9
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
Medlem sedan okt. 2002257 inlägg
#10

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
Medlem sedan dec. 200012 464 inlägg
#11

Dom torde vara likvärdiga (prestandamässigt förmodar jag att du avser).

Medlem sedan okt. 2002257 inlägg
#12

Ok, då kör jag på den jag gjorde :)

Tack för all hjälp på traven!

264 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)