03. juni 2005 - 15:20Der er
12 kommentarer og 1 løsning
Stilling: Formkurve
Hejsa..
Jeg har fået skruet følgende udtræk sammen:
SELECT k.navn AS club, k.id AS id, 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(IF(k.id = g.home AND (g.score_home) - (g.score_away) <> 0, (g.score_home) - (g.score_away), IF(k.id = g.away AND (g.score_away) - (g.score_home) <> 0, (g.score_away) - (g.score_home), 0))) 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 = '$_GET[league]' AND g.season = '$_GET[season]' GROUP BY k.id ORDER BY points DESC, goal_diff DESC, goals_f DESC, club ASC
Som udgør en fodboldstilling, men nu er det sådan at jeg gerne ville have en stilling over de 6 senest spillede kampe, og her er jeg altså lidt på dybt vand. Er der nogle der kan peje mig i den rigtige retning?
Så er du nødt til at enten hive de 6 seneste kamp-id'er ud først i en selvstændig query, bruge en subquery (kræver mysql 4.1+) eller sortere efter kampdato først...
Eftersom dette udtræk kun medtager spillede kampe, burde det vel i princippet ikke give noget problem at sortere efter kampdato først? I sidste ende ryger de ikke-spillede kampe jo ud og tilbage står man så med de seneste kampe..
Eller hvad?
Dog forstår jeg ikke helt hvordan du vil gøre det? Kan du vise mig hvordan du havde forestillet dig det?
Altså lav en query hvor du henter id'erne på de seneste 6 kampe. Så loop'er du over dem (en standard while(mysql_fetch_*) du ved) og propper dem i et array. Dette array indsætter du så via join i din WHERE betingelse.
Jeg skal vel ikke direkte skrive det for dig - det er jo helt basic php?
Hej igen.. Jeg må da indrømme at jeg aldrig har læst om php. Jeg har blot fået nogle koder fra en ven jeg så har ændret på og ellers fået hjælp udefra, så alle betegnelserne er ikke inkluderet i min verden, endnu.
Jeg ved godt det her absolut ikke er rigtigt, men det er sådan jeg forstod det:
<?php $query = mysql_query("SELECT id FROM kampe ORDER BY date DESC LIMIT 6"); while ($r = mysql_fetch_array($query)) {
$sql="SELECT k.navn AS club, k.id AS id, g.season AS season, COUNT(g.games) AS games_away, SUM(IF(g.score_home < g.score_away, 1, 0)) AS won_away, SUM(IF(g.score_home = g.score_away, 1, 0)) AS draw_away, SUM(IF(g.score_home > g.score_away, 1, 0)) AS lost_away, SUM(IF(g.score_away > 0, g.score_away, 0)) AS goals_f_away, SUM(IF(g.score_home > 0, g.score_home, 0)) AS goals_a_away, IF(SUM(g.score_away) - SUM(g.score_home) <> 0, SUM(g.score_away) - SUM(g.score_home), 0) AS goal_diff_away, SUM(IF(g.score_home < g.score_away, 3, IF(g.score_home = g.score_away, 1, 0))) AS points_away FROM _klubber AS k INNER JOIN kampe AS g ON k.id = g.away WHERE g.league = '$_GET[league]' AND g.season = '$_GET[season]' AND g.id IN (1,2,3,4,5,6) GROUP BY k.id ORDER BY points_away DESC, goal_diff_away DESC, goals_f_away DESC, club ASC "; $result = mysql_query("$sql")or die(mysql_error()); for ($i=1; $row = mysql_fetch_object($result); $i++){ $color = $q++ % 2 ? '#8FC7E1' : '#71B1CF'; ?> <?php
Well, det er jo helt ude i skoven - du har vist slet ikke forstået?
Du skal første finde id'erne på de 6 seneste kampe - hvilket gøres via den første query. Så skal du have disse 6 id'er indsat, hvor der nu står 1,2,3,4,5,6. Altså hvis de første 6 id'er er:
id ---- 5 11 17 29 31 79
Så skal disse indsættes og genereres strengen:
... g.id IN (5,11,17,29,31,79) ...
At du så ikke lige ved, hvordan det eventuelt gøres i php, har ikke så meget med at gøre, at du slet ikke har forstået princippet :/
Men i php gøres det lettest som:
$query = mysql_query("SELECT id FROM kampe ORDER BY date DESC LIMIT 6"); $games = array(); while ($r = mysql_fetch_array($query)) { $games[] = $r['id']; } $games = join(",", $games);
$sql = "SELECT k.navn AS club, k.id AS id, g.season AS season, COUNT(g.games) AS games_away, SUM(IF(g.score_home < g.score_away, 1, 0)) AS won_away, SUM(IF(g.score_home = g.score_away, 1, 0)) AS draw_away, SUM(IF(g.score_home > g.score_away, 1, 0)) AS lost_away, SUM(IF(g.score_away > 0, g.score_away, 0)) AS goals_f_away, SUM(IF(g.score_home > 0, g.score_home, 0)) AS goals_a_away, IF(SUM(g.score_away) - SUM(g.score_home) <> 0, SUM(g.score_away) - SUM(g.score_home), 0) AS goal_diff_away, SUM(IF(g.score_home < g.score_away, 3, IF(g.score_home = g.score_away, 1, 0))) AS points_away FROM _klubber AS k INNER JOIN kampe AS g ON k.id = g.away WHERE g.league = '$_GET[league]' AND g.season = '$_GET[season]' AND g.id IN (".$games.") GROUP BY k.id ORDER BY points_away DESC, goal_diff_away DESC, goals_f_away DESC, club ASC "; $result = mysql_query($sql)or die(mysql_error()); for ($i=1; $row = mysql_fetch_object($result); $i++){ $color = $q++ % 2 ? '#8FC7E1' : '#71B1CF';
Det er ikke, så voldsomt teknisk i php, hvis man bare generelt forstår at programmere. Men hvis man slet ikke har fanget princippet i første omgang, så er det selvfølgelig helt umuligt :/
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.