Avatar billede weeelo Nybegynder
03. juni 2005 - 15:20 Der 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?
Avatar billede barklund Nybegynder
03. juni 2005 - 15:33 #1
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...
Avatar billede barklund Nybegynder
03. juni 2005 - 15:42 #2
Løsning 1 er ret nemt implementeret, 2 ligeså. 3 er også nem, men giver dig til gengæld en forkert sorteret liste...
Avatar billede weeelo Nybegynder
03. juni 2005 - 15:49 #3
Kamp id'erne ligger ikke nødvendigvis i den rigtige rækkefølge, datomæssigt!

Hvordan ville du gribe nummer 2 an? Har ikke arbejdet med en subquery før..
Avatar billede weeelo Nybegynder
03. juni 2005 - 15:50 #4
Hmm, har desværre kun adgang til MySQL 4.0.20..
Avatar billede weeelo Nybegynder
03. juni 2005 - 15:59 #5
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?
Avatar billede barklund Nybegynder
04. juni 2005 - 20:55 #6
Jeg ville nok hive kamp-id'erne ud først selvstændigt som:

SELECT id FROM kampe ORDER BY kampdato DESC LIMIT 6

Og så lave et array af disse som du indsætter i en WHERE som:

....
WHERE
  g.league = '$_GET[league]' AND
  g.season = '$_GET[season]' AND
  g.id IN (1,2,3,4,5,6)

Altså 1-6 er numrene på de seneste 6 kampe.

Noget i den stil :)

--
Morten Barklund
Avatar billede barklund Nybegynder
14. juni 2005 - 23:20 #7
Noget du er kommet videre med?
Avatar billede weeelo Nybegynder
22. juni 2005 - 18:32 #8
Det havde jeg da helt smidt i glemmekrogen. I øvrigt underligt jeg først har fået mail om dit svar nu?

Men til sagen..

Jeg forstår ikke helt det med at lave et array som skal indsættes i en WHERE?
Avatar billede barklund Nybegynder
26. juni 2005 - 15:20 #9
Altså jeg har jo skitseret det ovenfor?

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?

--
Morten Barklund
Avatar billede weeelo Nybegynder
14. juli 2005 - 12:29 #10
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

$class = txt;

echo"
<table width=450 class=table align=center cellspacing=0 cellpadding=1>

    <tr style=\"background-color: $color;\">
        <td align=center class=txt width=5%><b>$i.</b></td>
        <td align=left width=30%><a href=\"clubs.php?id=$row->id&season=$row->season\">$row->club</a></td>
        <td align=center class=$class width=8%>$row->games_away</td>
        <td align=center class=$class width=8%>$row->won_away</td>
        <td align=center class=$class width=8%>$row->draw_away</td>
        <td align=center class=$class width=8%>$row->lost_away</td>
        <td align=center class=$class width=13%>$row->goals_f_away - $row->goals_a_away</td>
        <td align=center class=$class width=10%>$row->goal_diff_away</td>
        <td align=center class=$class width=10%>$row->points_away</td>
    </tr>
</table>
";
}}
?>
Avatar billede barklund Nybegynder
16. juli 2005 - 18:11 #11
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';

  $class = "txt";

  echo"
<table width=450 class=table align=center cellspacing=0 cellpadding=1>

    <tr style=\"background-color: $color;\">
        <td align=center class=txt width=5%><b>$i.</b></td>
        <td align=left width=30%><a href=\"clubs.php?id=$row->id&season=$row->season\">$row->club</a></td>
        <td align=center class=$class width=8%>$row->games_away</td>
        <td align=center class=$class width=8%>$row->won_away</td>
        <td align=center class=$class width=8%>$row->draw_away</td>
        <td align=center class=$class width=8%>$row->lost_away</td>
        <td align=center class=$class width=13%>$row->goals_f_away - $row->goals_a_away</td>
        <td align=center class=$class width=10%>$row->goal_diff_away</td>
        <td align=center class=$class width=10%>$row->points_away</td>
    </tr>
</table>
";
}

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 :/

--
Morten Barklund
Avatar billede weeelo Nybegynder
16. november 2005 - 15:42 #12
Hmm, jeg er droppet ideen. Men du skal selvfølgelig have point for indsatsen.

Så hvis du smider et svar?
Avatar billede barklund Nybegynder
16. november 2005 - 16:08 #13
Hehe, helt i orden :)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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