16. april 2005 - 20:31Der 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..
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...
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.
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..
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
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.
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..
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?
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.