Avatar billede weeelo Nybegynder
16. april 2005 - 20:31 Der er 17 kommentarer og
2 løsninger

Lidt hjælp til opbygning.

Hejsa..

Jeg står og skal lave et udtræk fra en db og mangler lidt hjælp. Nedenstående tabel er fodboldkampe med dato, hjemmehold, udehold, hjemmeholdets score, udeholdets score, hjemmeholdets score ved halvleg, udeholdets score ved halvleg, ligaen, sæsonen.


  `id` int(12) NOT NULL auto_increment,
  `date` date NOT NULL default '0000-00-00',
  `home` varchar(30) NOT NULL default '',
  `away` varchar(30) NOT NULL default '',
  `score_home` int(1) NOT NULL default '0',
  `score_away` int(1) NOT NULL default '0',
  `score_ht_home` int(1) NOT NULL default '0',
  `score_ht_away` int(1) NOT NULL default '0',
  `league` varchar(4) NOT NULL default '',
  `season` varchar(4) NOT NULL default '',

Fra denne tabel skal jeg danne en stilling, i en bestemt liga. Er der nogen der har en ide omkring hvordan det skal gøres? Hvis det kan lade sig gøre.

Stillingen skal indeholde: klubnavn, kampe, vundne, uafgjorte, tabte, målscore (mål scoret-mål indkasseret), points (3 point pr. sejr, 1 point pr. uafgjort), kampe hjemme, vundne hjemme, uafgjorte hjemme, tabte hjemme, målscore  hjemme, points hjemme,kampe ude, vundne ude, uafgjorte ude, tabte ude, målscore  ude, points ude.

Er der nogen der har nogle ideer eller måske ideer til en anden opbygning, hvor stillingen skal udledes udfra kampen..
Avatar billede barklund Nybegynder
16. april 2005 - 20:43 #1
Hm, er home og away navne på klubberne? Burde du ikke have klubberne liggende i en ekstra tabel og bare bruge id'er? Det vil i hvert fald hjælpe kraftigt! Og hvis du har det sådan, vil det nok kunne lade sig gøre...
Avatar billede weeelo Nybegynder
16. april 2005 - 20:44 #2
home og away er klubberne.. Jeg har klubberne i en anden tabel, men forstår ikke helt hvordan det ændrer situationen? Kan du uddybe det lidt bedre?
Avatar billede barklund Nybegynder
16. april 2005 - 20:46 #3
Brug klubbernes id i stedet for deres navne. Har du ikke et (unikt) id for hver klub?
Avatar billede weeelo Nybegynder
16. april 2005 - 20:49 #4
Jo, det har jeg. Kan du give et eksempel på hvordan du ville lave et sådan udtræk?

min første tabel hedder "kampe", den anden hedder "klubber" og ser således ud:
  `navn` varchar(100) default NULL,
  `nick` varchar(60) default NULL,
  `titler` text,
  `land` varchar(60) default NULL,
  `liga` varchar(4) default NULL,
  `city` varchar(60) default NULL,
  `id` int(6) NOT NULL auto_increment,
  `grunlagt` varchar(4) default NULL,
  `website` varchar(60) default NULL,
  `stadion` varchar(60) default NULL,
  `kap` varchar(10) default NULL,
Avatar billede weeelo Nybegynder
17. april 2005 - 12:51 #5
Jeg forstår ikke helt hvordan du mener barklund? Hvorfor skulle et id gøre det mere overskueligt i forhold til et navn?
Avatar billede barklund Nybegynder
17. april 2005 - 14:59 #6
Du skal jo ikke opbygge dine tabeller for at du nemmere kan finde rundt i dem - men for at mysql nemmere kan.

Og jeg tror helt ærligt at det er hurtigere at slå id 4 op end at slå "Brøndby idrætsforening" op - men det er måske bare mig :)

Derudover er det ikke nogen helt nem query - jeg kan sgu ikke lige se, hvordan man fornuftigt skulle samle det. Jeg kan lave en query, der henter info om alle holdenes hjemmekampe og en anden om deres udekampe. Men jeg kan ikke lige se, hvordan jeg skulle få hentet begge ting ordentligt. At have de i to er vel også fint nok - så kan man summere uden for.
Avatar billede weeelo Nybegynder
17. april 2005 - 16:17 #7
Hehe, selvfølgelig rigtigt det med id'erne.

Gider du prøve at give et eks. på en query om holdenes hjemmekampe, så jeg ligesom får ideen af hvordan du vil gøre, så kan jeg nemlig selv prøve at kigge lidt på det..
Avatar billede barklund Nybegynder
17. april 2005 - 17:02 #8
Jo, det vil være noget med:

SELECT
  k.navn AS klubnavn,
  COUNT(g.id) AS antal_hjemmekampe,
  SUM(IF(g.score_home > g.score_away, 1, 0)) AS antal_hjemmesejre,
  SUM(IF(g.score_home = g.score_away, 1, 0)) AS antal_hjemmeuafgjorte,
  SUM(IF(g.score_home < g.score_away, 1, 0)) AS antal_hjemmetabte,
  SUM(g.score_home) - SUM(g.score_away) AS hjemme_maalscore,
  SUM(IF(g.score_home > g.score_away, 3, IF(g.score_home = g.score_away, 1, 0))) AS hjemme_point
FROM
  klubber AS k
  INNER JOIN kampe AS g
    ON k.id = g.home
WHERE
  g.league = <liga> AND
  g.season = <sæson>
GROUP BY
  k.id
ORDER BY
  hjemme_point DESC,
  hjemme_maalscore DESC

Prøv engang :)
Avatar billede weeelo Nybegynder
17. april 2005 - 21:58 #9
Ok.. www.footballworld.dk/season/test.php

Der er en smule problemer hist og her. Den samlede tabel har jeg ikke gjort meget ved, men lad os lige kigge på de to hjemme- og udetabeller:

SELECT
  k.navn AS club,
  COUNT(g.id) AS games_home,
  SUM(IF(g.score_home > g.score_away, 1, 0)) AS won_home,
  SUM(IF(g.score_home = g.score_away, 1, 0)) AS draw_home,
  SUM(IF(g.score_home < g.score_away, 1, 0)) AS lost_home,
  SUM(g.score_home) AS goals_f_home,
  SUM(g.score_away) AS goals_a_home,
  SUM(g.score_home) - SUM(g.score_away) AS goal_diff_home,
  SUM(IF(g.score_home > g.score_away, 3, IF(g.score_home = g.score_away, 1, 0))) AS points_home
FROM
  _klubber AS k
  INNER JOIN kampe AS g
    ON k.id = g.home
WHERE
  g.league = 'eng1' AND
  g.season = '2004'
GROUP BY
  k.id
ORDER BY
  points_home DESC,
  goal_diff_home DESC,
  goals_f_home DESC

Det er min query på hjemmetabellen. Problemet er at de sidste 10 står noteret for spillede kampe, og samtidig er måldifferencen og målscoren blank.
Avatar billede weeelo Nybegynder
18. april 2005 - 23:47 #10
Ingen hjælp?
Avatar billede weeelo Nybegynder
19. april 2005 - 19:20 #11
Skal der flere point til eller er folk bare i tænkeboks, eller måske er det bare for kompliceret?
Avatar billede weeelo Nybegynder
22. april 2005 - 11:12 #12
Skal det lukkes?
Avatar billede weeelo Nybegynder
23. april 2005 - 10:57 #13
Jeg har nu fået 100% styr på hjemme og ude tabellerne.. Nu skal den samlede tabel også fixes. Barklund vil du have nogle point for din hjælp? Selvom du ikke har hjulpet med at finde den endelige løsning har du hjulpet mig et STORT skridt i den rigtige retning..
Avatar billede weeelo Nybegynder
23. april 2005 - 12:17 #14
SELECT
  k.navn AS club,
  COUNT(g.games) AS games,
  SUM(IF(k.id = g.home AND g.score_home > g.score_away, 1, IF(k.id = g.away AND g.score_home < g.score_away, 1, 0))) AS won,
  SUM(IF(k.id = g.home AND g.score_home = g.score_away, 1, IF(k.id = g.away AND g.score_home = g.score_away, 1, 0))) AS draw,
  SUM(IF(k.id = g.home AND g.score_home < g.score_away, 1, IF(k.id = g.away AND g.score_home > g.score_away, 1, 0))) AS lost,
  SUM(IF(k.id = g.home AND g.score_home > 0, g.score_home, IF(k.id = g.away AND g.score_away > 0, g.score_away, 0))) AS goals_f,
  SUM(IF(k.id = g.home AND g.score_away > 0, g.score_away, IF(k.id = g.away AND g.score_home > 0, g.score_home, 0))) AS goals_a,
  SUM(g.score_home) - SUM(g.score_away) AS goal_diff,
  SUM(IF(k.id = g.home AND g.score_home > g.score_away, 3, IF(k.id = g.home AND g.score_home = g.score_away, 1, IF(k.id = g.away AND g.score_home < g.score_away, 3, IF(k.id = g.away AND g.score_home = g.score_away, 1, 0))))) AS points
FROM
  _klubber AS k
  INNER JOIN kampe AS g
    ON k.id = g.home OR
    k.id = g.away
WHERE
  g.league = 'eng1' AND
  g.season = '2004' AND
  g.home <> g.away
GROUP BY
  k.id
ORDER BY
  points DESC,
  goal_diff DESC,
  goals_f DESC

Sådan ser mit udtræk ud for den samlede stilling. Jeg har problemer med at få måldifferencen til at virke. Nogen der kan hjælpe?
Avatar billede weeelo Nybegynder
23. april 2005 - 12:26 #15
SUM(IF(k.id = g.home AND SUM(g.score_home) - SUM(g.score_away) <> 0, SUM(g.score_home) - SUM(g.score_away), IF(k.id = g.away AND SUM(g.score_away) - SUM(g.score_home) <> 0, SUM(g.score_away) - SUM(g.score_home), 0))) AS goal_diff,

=

Invalid use of group function
Avatar billede weeelo Nybegynder
23. april 2005 - 12:30 #16
Så fik jeg styr på det.. Nogle der vil have point?
Avatar billede barklund Nybegynder
24. april 2005 - 14:34 #17
Yeshyesh, sig til hvis du stadig har spørgsmål :)
Avatar billede weeelo Nybegynder
24. april 2005 - 14:38 #18
Jeg har givet dig 100 point for den gode hjælp.. Takker..!
Avatar billede barklund Nybegynder
24. april 2005 - 14:43 #19
Helt fint - tark for points :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester