Position eines Teams in Tabelle ermitteln

DonDemf

Erfahrenes Mitglied
Hallo Leute,
ich lasse mit PHP / MYSQL eine Fußballtabelle generieren, welche alle Teams der Tabelle "fifa_mannschaften" auflistet, die in der "1. Euroliga" spielen.

Ich bestimme anschließend die Position mit der variabel $pos. Unter andere auch damit aufstiegsplätze etc. farblich markiert werden können.

Code:

PHP:
$colors = array_fill(1, 1,'#7F99FF') 
        + array_fill(2, 2, '#00CC33')
        + array_fill(4, 3, '#99E500')
+ array_fill(7, 6, '')
		+ array_fill(13, 2, '#FF0000');
 

//Die Position definieren        
$pos=0;
while($row_bl = mysql_fetch_object($ergebnis_bl))
   {
	   $td = $row_bl->tore - $row_bl->gegentore;
	   
	   $abfrage_spieler = 'SELECT * FROM fusionafdce_users WHERE user_name = "'.$row_bl->besitzer.'"';
$ergebnis_spieler = mysql_query($abfrage_spieler);
while($rowbesitzer = mysql_fetch_object($ergebnis_spieler))
    {
		$icqbesitzer = $rowbesitzer->user_icq;
    }
   echo '<tr>
    <td bgcolor="'.$colors[++$pos].'" width="31" align="left">'.$pos.'</td>
    <td bgcolor="'.$colors[$pos].'" width="39" align="left"><img src="image/vereine/'.$row_bl->id.'.png"></td>
    <td bgcolor="'.$colors[$pos].'" width="139" align="left"><a href="?page_id=28&verein='.$row_bl->id.'">'.$row_bl->name.'</a></td>
    <td bgcolor="'.$colors[$pos].'" width="99" align="left">';

	if($row_bl->besitzer=="") {
		echo ''.$row_bl->besitzer.''; } else {
			echo '<img src="http://online.mirabilis.com/scripts/online.dll?icq='.$icqbesitzer.'&img=5">'.$row_bl->besitzer.''; }
	
	
	echo '</td>
    <td bgcolor="'.$colors[$pos].'" width="42" align="left">'.$row_bl->spiele.'</td>
    <td bgcolor="'.$colors[$pos].'" width="30" align="left">'.$row_bl->siege.'</td>
    <td bgcolor="'.$colors[$pos].'" width="30" align="left">'.$row_bl->unentschieden.'</td>
    <td bgcolor="'.$colors[$pos].'" width="30" align="left">'.$row_bl->niederlagen.'</td>
    <td bgcolor="'.$colors[$pos].'" width="60" align="left">'.$row_bl->tore.':'.$row_bl->gegentore.'</td>
    <td bgcolor="'.$colors[$pos].'" width="36" align="left">'.$td.'</td>
    <td bgcolor="'.$colors[$pos].'" width="54" align="left">'.$row_bl->punkte.'</td>
  </tr>';
   }

Nun möchte ich außerhalb dieses Scripts auch die Position eines Teams ermitteln. Da die Position nicht in der MYSQL tabelle gespeichert wirdm weiß ich nicht genau, wie ich es machen soll.

Es soll ein script werden, ala:
Code:
if($pos_team == $erhoffte_position) {

belohne das team } else {
bestrafe das team }


Ich hoffe ihr könnt mir da weiterhelfen und habt verstanden, was ich erreichen möchte ;-)

Danke im vorraus!
 
Jepp. Du kannst das alles einem einzigen SQL machen.

1) nach Punkten sortieren
2) durchnummerieren (die Psotitionen definieren)
3) Eine Position geziehlt auslesen

Man muss dabei auf Unterabfragen und SQL-Variablen zugreiffen, da MySQL keine RownUm kennt. Ich verende als Basis die folgende Rownum-Methode: MySQL Rownum (Zeilennummer)

Hier ein Beispiel wie du die Mansnchaft 'FC Hinterpfufigen'
SQL:
SELECT
	pos
FROM
	-- Die soriterte und durchnummerierte Liste:
	(
		SELECT
		    @pos:=@pos+1 AS pos,
		    fifa_m.mannschaft
		FROM
		    -- Initialisierend er Varable
		    (SELECT @pos:=0) AS vars,
		    fifa_mannschaften AS fifa_m
		ORDER BY
		    fifa_m.punkte DESC
	) AS rangliste
WHERE
	mannschaft = 'FC Hintepfufigen'
 
Zuletzt bearbeitet von einem Moderator:
Hey,
danke für die fixe antwort ;-)

Ich verstehe teilweise, was du mir dort aufgeschrieben hast. aber nicht alles.

"Select pos" kann doch nicht funktionieren, da ich keine spalte "pos" habe oder?
und kann man das verallgemeiner für alle Teams, wo die spalte "liga" = "1. Euroliga" ist?

Und wo kommt dann die anweisung hin, von dir ich am anfang gesprochen habe?
 
Also, pos hast du.
Auch die 3 Anweisungen sind alle in diesem SQL drin. Einzig der Filter auf die 1. Liga nicht.
Ich zerleg das SQL mal und erkläre es dir


Als erstes erstellen wir ein SQL das uns die Variable definiert, die wir brauchen um die Position zu bestimmen.
In MySQL beginnen Variablen immer mit einem @. Wenn man einer Variable einen Wert zuschreiben möchte, dann geht das über :=
Und so initialisiere ich die Variable @pos mit dem Wert 0 (gibt so ausgeführt genau eine Zeile mit einem Feld un dem Wert 0)
SQL:
SELECT @pos:=0
Dieses kombiniere ich nun mit deiner fifa_mannschaften Tabelle und sortieren sie nach den Punkten. Zudem baue ich hier den Filter ein um die 1. Liga zu bekommen.
SQL:
SELECT
	fifa_m.mannschaft
FROM
-- Zusammenführung der Variablen-Tabelle und deinen 
	(SELECT @pos:=0) AS vars,
	fifa_mannschaften AS fifa_m
-- Filterung der 1. Liga	
WHERE
	fifa_m.liga = '1. Euroliga'
-- Sortierung auf die Punktzahl absteigend	
ORDER BY
    fifa_m.punkte DESC
Noch haben wir keine Position. Dafür alle Manschaften über die die Position bestimmt wird in der richtigen Reihenfolge.
MySQL geht mit den Variablen nun so um wie Excel mit seinen Formeln. Also von Oben nach Unten. Der Erste Datensatz kommt zuerst, dann der Zweite undsoweiter. Innerhalb eines Datensatzes von Links nch Rechts. Zuerst kommt die erste Spalte, dann die Zweite etc.
Innerhalb der Zeile ud jeder Spalte kann die Variable verändert werden und behält dann Zeilen- und Spaltenübergreifned seinen Wert bis er wieder neu mittels := geändert wird. Dies geschieht erst nach der Filterung und nach der Sortierung.
Unsere Variable @pos hat also vorerst den Wert 0. Nun wollen wir in der ersten Zeile den Wert 1. In der ZWeiten den Wert 2 etc.
Wenn wir also in unserem Resultat jedesmal den Wert von @pos um 1 erhöhen, dann haben wir die Position der Manschaft innerhalb der Rangliste
SQL:
-- Mit dieser Zeile wird die Position um eines erhöht 
-- und gleichzeitig unter dem Alias pos im Resultat ausgegeben
@pos:=@pos+1 AS pos
Also sieht die Rangliste so aus
SQL:
SELECT
    @pos:=@pos+1 AS pos,
	fifa_m.mannschaft
FROM
    (SELECT @pos:=0) AS vars,
    fifa_mannschaften AS fifa_m
WHERE
	fifa_m.liga = '1. Euroliga'
ORDER BY
    fifa_m.punkte DESC
Dies gibt die Mannschaften und ihre Postitionen aus.
Von diesem Resultat willst du die Position der Mannschaft abc haben. Ergo nimmst du dieses SQL als Quelle für ein neues SELECT-Statement
SQL:
-- Allgemeines Subquery-Konstrukt:
SELECT
    yz.*
FROM
    (SELECT * FROM xy) AS yz;
-- Das ganez auf uns andewandt
SELECT
    pos
FROM
    -- Die soriterte und durchnummerierte Liste:
    (
		SELECT
		    @pos:=@pos+1 AS pos,
			fifa_m.mannschaft
		FROM
		    (SELECT @pos:=0) AS vars,
		    fifa_mannschaften AS fifa_m
		ORDER BY
		    fifa_m.punkte DESC
		    ) AS rangliste
WHERE
    rangliste.mannschaft = 'abc'
 
Zuletzt bearbeitet von einem Moderator:
Also für das Team Borussia Dortmund wäre folgendes Script richtig:

PHP:
<?php
// Allgemeines Subquery-Konstrukt:
 $mysql="SELECT
    pos
FROM
    
    (
        SELECT
            @pos:=@pos+1 AS pos,
            fifa_m.mannschaft
        FROM
            (SELECT @pos:=0) AS vars,
            fifa_mannschaften AS fifa_m
        ORDER BY
            fifa_m.punkte DESC
            ) AS rangliste
WHERE
    rangliste.mannschaft = 'Borussia Dortmund'";
	
	if($pos >= "2" AND $pos <= "5") {
		
		echo 'Du hast deinen erhofften Platz ('.$pos.') erreicht'; } else {
			
		echo 'Du hast dein ziel nicht erreicht.';
		}

?>
 
Fast. Du musst $mysql noch auswerten mit mysql_query() und mysql_fetch_assco() oder mysql_result()
Zudem solltest du den Teamnamen als Variabel übergeben - besser für die Zukunft.
Und falls du das an mehreren Orten in deinem Code brauchst, schreibe eine Funktion

PHP:
$selectedTeam = 'Borussia Dortmund';
$pos = getPosition($selectedTeam);

function getPosition($team){
	$sql = "
		SELECT
		    yz.*
		FROM
		    (SELECT * FROM xy) AS yz;
		SELECT
		    pos
		FROM
		    (
		        SELECT
		            @pos:=@pos+1 AS pos,
		            fifa_m.mannschaft
		        FROM
		            (SELECT @pos:=0) AS vars,
		            fifa_mannschaften AS fifa_m
		        ORDER BY
		            fifa_m.punkte DESC
		            ) AS rangliste
		WHERE
		    rangliste.mannschaft = '{$team}'";
    $result = mysql_query($sql);
    return mysql_result($result, 0); 
}
 
Ok,
also bei Funktionen etc. bin ich noch nicht so bewandert. aber so weit ich weiß, muss ich sie jetzt aufrufen und dann meine IF anweisung durchführen oder?

PHP:
<?php
$selectedTeam = 'Borussia Dortmund';
$pos = getPosition($selectedTeam);

function getPosition($team){
    $sql = "
        SELECT
            yz.*
        FROM
            (SELECT * FROM xy) AS yz;
        SELECT
            pos
        FROM
            (
                SELECT
                    @pos:=@pos+1 AS pos,
                    fifa_m.mannschaft
                FROM
                    (SELECT @pos:=0) AS vars,
                    fifa_mannschaften AS fifa_m
                ORDER BY
                    fifa_m.punkte DESC
                    ) AS rangliste
        WHERE
            rangliste.mannschaft = '{$team}'";
    $result = mysql_query($sql);
    return mysql_result($result, 0); 
} 
	getPosition();

	if($pos=="13") {
		
		echo 'Du hast deinen erhofften Platz ('.$pos.') erreicht'; } else {
			
		echo 'Du hast dein ziel nicht erreicht.';
		}

?>


edit: obwohl, sie wird ja eigentlich hier schon aufgerufen oder?
PHP:
$pos = getPosition($selectedTeam);
 
Jepp, ganau dort. Nachher hast du $pos und du kannst es so verwenden wie von dir vorgschlagen.
Ich empfehle dir, PHP-Befehle und konstrukte die du nicht kennst nachzulesen was sie machen. Mit reinem C&P gibts immer Probleme. So ist in meinem SQL bereits die Annahme drin, dass die Felder die wir brauchen bei dir punkte und mannschaft heissen. Kann ja aber auch anderst sein. Dann musst du wissen wo du das anpassen musst.
 
ja,
ich habe mir das konstrukt von dir natürlich durchgelesen und auch versucht nachzuvollziehen. mannschaft müsste man glaube ich zu name ändern, weil die Spalte "name" heißt, in der Borussia Dortmund steht. Punkte ist richtig.

habe jetzt folgendes gemacht:

PHP:
<?php
function getPosition($team){
    $sql = "
        SELECT
            yz.*
        FROM
            (SELECT * FROM xy) AS yz;
        SELECT
            pos
        FROM
            (
                SELECT
                    @pos:=@pos+1 AS pos,
                    fifa_m.name
                FROM
                    (SELECT @pos:=0) AS vars,
                    fifa_mannschaften AS fifa_m
                ORDER BY
                    fifa_m.punkte DESC
                    ) AS rangliste
        WHERE
            rangliste.name = '{$team}'";
    $result = mysql_query($sql);
    return mysql_result($result, 0); 
} 

$selectedTeam = 'Borussia Dortmund';
$pos = getPosition($selectedTeam);


	
	if($pos=="13") {
		
		echo 'Du hast deinen erhofften Platz ('.$pos.') erreicht'; } else {
			
		echo 'Du hast dein ziel nicht erreicht.';
		}

?>

ausgabe ist jedoch immer der Else - Teil..
 
Ups, mein C&P-Fehler Sorry. Im SQL stecken 2 SQLs drin. Asche über mein Haubt.

So müsste natürlich das SQL sein.
PHP:
    $sql = "
        SELECT
            pos
        FROM
            (
                SELECT
                    @pos:=@pos+1 AS pos,
                    fifa_m.name
                FROM
                    (SELECT @pos:=0) AS vars,
                    fifa_mannschaften AS fifa_m
                ORDER BY
                    fifa_m.punkte DESC
                    ) AS rangliste
        WHERE
            rangliste.name = '{$team}'";
 
Zurück