"Position" im MySQL Abfrageergebnis

"Position" im MySQL Abfrageergebnis

am 28.07.2006 23:36:42 von Mirko Haaser

Hallo zusammen,

ich habe folgendes Problem bei einer SQL Abfrage:

Für eine Hockey-Vereinsseite habe ich eine Abfrage [1], die aus
erfassten Begegnungen, Spielern, Spieltagen und Saisons eine aktuelle
Tabelle für die Saison ermittelt. Dabei wird die Reihenfolge der Spieler
per GROUP BY gebildet und die Position in der Saisontabelle durch die
Reihenfolge im Resultset bestimmt.

Dieses Ergebnis möchte ich als SUB-SELECT jetzt gerne weiterverarbeiten
(die Bewegung eines Spielers in der Tabelle während einer Saison).
Bisher habe ich die Position per Zählervariable in einer

while ($row = mysql_fetch_array)
{
echo "Platz: ".$i++;
}

Schleife abgefragt.

Gibt es eine Funktion in MySQL, die mir die aktuelle Position in einem
Resultset liefert?

Einfacheres Beispiel:

Tabelle mit Spalte id und den Einträgen id = 1, id = 4, id = 10

SELECT id FROM Tabelle ORDER BY id ASC

gibt:
1
4
10

Ich möchte jetzt ein Ergebnis in der Form:

SELECT [MEINE GESUCHTE FUNKTION], id FROM Tabelle ORDER by id ASC

1 1
2 4
3 10

Wie bekomme ich die erste Zahl?!?

Ich hoffe, ich konnte mich verständlich ausdrücken...

Viele Grüße,
Mirko

[1] Hier die bisherige Abfrage:

SELECT saison.name AS Saison,
spieler.spielername AS Name,
spieler.id AS Id,
SUM((CASE
WHEN spiel.punkte_rot > spiel.punkte_weiss AND x.mannschaft = 'rot' THEN 2
WHEN spiel.punkte_rot < spiel.punkte_weiss AND x.mannschaft = 'weiss' THEN 2
WHEN spiel.punkte_rot = spiel.punkte_weiss THEN 1
ELSE 0
END)) As Punkte_Po,
SUM((CASE
WHEN spiel.punkte_rot > spiel.punkte_weiss AND x.mannschaft = 'rot' THEN 0
WHEN spiel.punkte_rot < spiel.punkte_weiss AND x.mannschaft = 'weiss' THEN 0
WHEN spiel.punkte_rot = spiel.punkte_weiss THEN 0
ELSE 2
END)) As Punkte_Ne,
SUM((CASE
WHEN spiel.punkte_rot > spiel.punkte_weiss AND x.mannschaft = 'rot' THEN 2
WHEN spiel.punkte_rot < spiel.punkte_weiss AND x.mannschaft = 'weiss' THEN 2
WHEN spiel.punkte_rot = spiel.punkte_weiss THEN 1
ELSE -2
END)) As Punkte_Ges,
SUM((CASE
WHEN spiel.punkte_rot > spiel.punkte_weiss AND x.mannschaft = 'rot' THEN
spiel.punkte_rot
WHEN spiel.punkte_rot < spiel.punkte_weiss AND x.mannschaft = 'weiss'
THEN spiel.punkte_weiss
WHEN spiel.punkte_rot = spiel.punkte_weiss THEN spiel.punkte_rot
ELSE 0
END)) As Tore_Po,
SUM((CASE
WHEN spiel.punkte_rot > spiel.punkte_weiss AND x.mannschaft = 'rot' THEN
spiel.punkte_weiss
WHEN spiel.punkte_rot < spiel.punkte_weiss AND x.mannschaft = 'weiss'
THEN spiel.punkte_rot
WHEN spiel.punkte_rot = spiel.punkte_weiss THEN spiel.punkte_rot
ELSE 0
END)) As Tore_Ne,
SUM((CASE
WHEN spiel.punkte_rot > spiel.punkte_weiss AND x.mannschaft = 'rot' THEN
spiel.punkte_rot - spiel.punkte_weiss
WHEN spiel.punkte_rot > spiel.punkte_weiss AND x.mannschaft = 'weiss'
THEN spiel.punkte_weiss - spiel.punkte_rot
WHEN spiel.punkte_rot < spiel.punkte_weiss AND x.mannschaft = 'rot' THEN
spiel.punkte_rot - spiel.punkte_weiss
WHEN spiel.punkte_rot < spiel.punkte_weiss AND x.mannschaft = 'weiss'
THEN spiel.punkte_weiss - spiel.punkte_rot
WHEN spiel.punkte_rot = spiel.punkte_weiss THEN 0
END)) As Tore_Ges,
COUNT(spiel.id) AS Spiele
FROM hockey_spieler AS spieler
JOIN hockey_x_spieler_spiel AS x ON x.spieler_id = spieler.id
JOIN hockey_spiel AS spiel ON spiel.id = x.spiel_id
JOIN hockey_spieltag AS tag ON tag.id = spiel.spieltag_id
JOIN hockey_saison AS saison ON saison.id = tag.saison_id
WHERE saison.id = 5
GROUP BY Saison, Name
ORDER BY Punkte_Po DESC, Tore_Po DESC, Tore_Ne DESC

Re: "Position" im MySQL Abfrageergebnis

am 29.07.2006 00:03:49 von Carsten Wiedmann

Mirko Haaser schrieb:

> Gibt es eine Funktion in MySQL, die mir die aktuelle Position in einem
> Resultset liefert?

Erst am 14.07.2006 gab es hier dieselbe Frage:
Position eines Datensatzen in einer Rückgabe (?!?)
<44b7a79e$0$26261$9b4e6d93@newsread2.arcor-online.net>

Gruß
Carsten

Re: "Position" im MySQL Abfrageergebnis

am 29.07.2006 00:25:42 von Mirko Haaser

Hallo Carsten,

Manchmal sieht man den Wald... (den Rest kennst du). Die angebotene
Lösung klingt gut. Ich werde mich gleich daran machen, sie umzusetzen.

Schönen Abend noch und vielen Dank,
Mirko