knifflige Abfrage

Online-Skater

Erfahrenes Mitglied
Hallo also bin die ganze Zeit am überlegen wie ich diese Abfrage am besten mache.

Tabellenlayout
Code:
id smallint(2) auto_increment primary key not null,
ms varchar(30) not null,
spiele smallint(2) not null,
siege smallint(2) not null,
unent smallint(2) not null,
nieder smallint(2) not null,
tore smallint(2) not null,
gtore smallint(2) not null

Die Abfrage soll mir die Mannschaft liefern, die die meisten Tore hat, das ist ja einfach wenn man weiß das es nur eine ist, aber es kann ja mehr als nur eine Mannschaft sein.
Ich weiß die Ausgabe gehört ins PHP-Forum aber deswegen 2 Threads zu machen ist Blödsinn, zumal die meisten Mysql und PHP beherschen dürften ;)

Die Ausgabe soll nicht Tabellarisch erfolgen sondern möglichst hintereinander weg.

Beispiel
Code:
Mannschaft mit:

den meisten Toren: Werder Bremen
bzw.
Code:
Mannschaft mit:

den meisten Toren: Werder Bremen, Borussia Dortmund, Schalke

das geht ja schlecht mit einer while Schleife !?

Desweiteren frage ich die Mannschaft mit den meisten Gegentoren, die höchste Differenz und die niedrigste Differenz ab, kann man diese 4 Abfragen so verbinden das es nur eine wird mit JOIN bzw LEFT JOIN ?

Danke für die Hilfe
 
Hallo,

du musst zwei Abfragen machen:
1. Was ist die höchste Anzahl an Toren (tore)
2. Welches sind die Manschaften, die diese Anzahl an Toren erziehlt hat (ms)

PHP:
$link = mysql_pconnect($db_host,$db_user,$db_pass);
 @mysql_select_db($db_name,$link)
     OR die (mysql_error());

$tabelle = "tabellenname";

// die höchste Anzahl Tore (tore)
$sql="SELECT MAX(tore) as maxtore from $tabelle;";
$result = mysql_query($sql,$link);
$erg = mysql_fetch_object($result);
$maxtore = $erg->maxtore;

// welche Manschaften haben $maxtore erzielt?
query="SELECT ms  FROM $tabelle WHERE tore = '$maxtore';";
$result= mysql_query($query, $link);

//gibt den ms-Namen so oft aus, wie einer vorkommt:
$num = mysql_num_rows($result);
echo "Mannschaft mit den meisten Toren:  ";
for ($i=0; $i<$num; $i++)
{
 $ms = mysql_result($result, $i, "gebot");
 echo $ms." ,";
}

So sollte das gehen.
 
Zuletzt bearbeitet:
Vielen Dank für den Lösungsansatz so ähnlich habe ich es denn auch gemacht und damit der Quellcode nicht zu lang wird eine Funktion gebastelt.

PHP:
function Ausgabe($sql)
{
  if ($erg = mysql_query($sql))
  {
    $num = mysql_num_rows($erg);
    $i = 0;
    echo '<td><b>';
    while ($row = mysql_fetch_object($erg))
    {
      if ($num == 1)
      {
        echo $row->ms;
      }
      else {
             $i++;
             echo $row->ms;
             if ($i < $num)
             {
               echo ', ';
             }
           }
    }
    echo '</b></td>';
  }
  else Fehler();
}

$sql = "SELECT MAX(tore) as maxtore,MAX(gtore) as mintore, MAX(tore-gtore) as pdiff, MIN(tore-gtore) as ndiff
        FROM ds_statistik WHERE spiele > 0";
if ($erg = mysql_query($sql))
{
  if (mysql_num_rows($erg) > 0)
  {
    $row = mysql_fetch_object($erg);
    $maxtore = $row->maxtore;  // Max Tore
    $mintore = $row->mintore;  // Min Tore
    $pdiff = $row->pdiff;      // positive Differenz
    $ndiff = $row->ndiff;      // negative Differenz

    $sql1 = "SELECT ms FROM ds_statistik WHERE tore = '$maxtore' LIMIT 3;";
    $sql2 = "SELECT ms FROM ds_statistik WHERE gtore = '$mintore' LIMIT 3;";
    $sql3 = "SELECT ms,(tore-gtore) as diff FROM ds_statistik WHERE (tore-gtore) = '$pdiff' LIMIT 3;";
    $sql4 = "SELECT ms,(tore-gtore) as diff FROM ds_statistik WHERE (tore-gtore) = '$ndiff' LIMIT 3;";
    echo '<b>Mannschaft mit:</b><br /><br/>
          <table border="0" class="stat"><tr><td><font>den meisten Toren:</td>';
    Ausgabe($sql1);
    echo '</tr><tr><td>den meisten Gegentoren:</td>';
    Ausgabe($sql2);
    echo '</tr><tr><td>der besten Differenz:</td>';
    Ausgabe($sql3);
    echo '</tr><tr><td>der schlechtesten Differenz:</td>';
    Ausgabe($sql4);
    echo '</tr></table>';
  }
  else {
         echo '<i>Noch keine Spiele gespielt !</i>';
       }
}
else Fehler();

Falls noch einer weis wie man diese 5 SQL-Abfragen in einer Super heftigen Abfrage bekommt, würde mich das gerne interessieren, rein als Wissenserweiterung ;)
Das ganze könnt ihr hier bestaunen http://bundesliga.thedoorstander.de
 
Hallo,

du wolltest es so ;)

PHP:
<?php

$result = mysql_query("

SELECT

	IF(`s2`.`id` IS NULL, `s1`.`ms`, NULL) AS `max`,
	IF(`s3`.`id` IS NULL, `s1`.`ms`, NULL) AS `maxg`,
	IF(`s4`.`id` IS NULL, `s1`.`ms`, NULL) AS `maxdiff`,
	IF(`s5`.`id` IS NULL, `s1`.`ms`, NULL) AS `mindiff`

FROM `ds_statistik` `s1`

LEFT JOIN
	`ds_statistik` `s2` ON (`s1`.`tore` < `s2`.`tore`)
LEFT JOIN
	`ds_statistik` `s3` ON (`s1`.`gtore` < `s3`.`gtore`)
LEFT JOIN
	`ds_statistik` `s4` ON (
		(`s1`.`tore`-`s1`.`gtore`) < (`s4`.`tore`-`s4`.`gtore`)
	)
LEFT JOIN 
	`ds_statistik` `s5` ON (
		(`s1`.`tore`-`s1`.`gtore`) > (`s5`.`tore`-`s5`.`gtore`)
	)

GROUP BY
	`max`, `maxg`, `maxdiff`, `mindiff`
	
HAVING NOT (`max` IS NULL AND `maxg` IS NULL AND
			`maxdiff` IS NULL AND `mindiff` IS NULL)"
);

$resultList = array();

while ($row = mysql_fetch_assoc($result)) {
	foreach ($row as $key => $value) {
		if (!is_null($value)) {
			$resultList[$key][] = $value;
		}
	}
}

echo 'Die meisten Tore: '.implode(', ', $resultList['max'])."\n";
echo 'Die meisten Gegentore: '.implode(', ', $resultList['maxg'])."\n";
echo 'Die beste Differenz: '.implode(', ', $resultList['maxdiff'])."\n";
echo 'Die schlechteste Differenz: '.implode(', ', $resultList['mindiff'])."\n";

?>

Aber frag mich nicht, wie's da mit der Performance aussieht. Ließe sich übrigens auch hübsch über Subselects lösen, aber in der Form ist es wohl am kompatibelsten.

Grüße,
Matthias
 
Zurück