• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

MySQL - MAX

EndOfGreen

Neues Mitglied
PHP:
<?php 
 $sql = mysql_query("SELECT `Fahrer`, AUS + MAL + CHN + TUR + ESP + MON + CAN + EUR + GBR + HUN + BEL + ITA + SIN + JPN + KOR + IND + ABD + BRA AS GES                    
FROM `Fahrer_Ergebnisse_Liga1`              
WHERE GES = (SELECT MAX(AUS + MAL + CHN + TUR + ESP + MON + CAN + EUR + GBR + HUN + BEL + ITA + SIN + JPN + KOR + IND + ABD + BRA) 
                      FROM `Fahrer_Ergebnisse_Liga1`);");    
 
while ($data = mysql_fetch_assoc($sql))             {
      echo "WM-Fürhrender".$data["Fahrer"].;
} ?>

Das Problem besteht darin, dass nichts ausgegeben wird. Liegt wohl daran, dass 'GES' nicht in der DB vorhanden ist, sondern erst auf der Seite berechnet wird. Leider weiß ich nicht, wie man das sonst lösen könnte. :(
 
Werbung:
Das sieht so aus, als hättest beim Fahrer pro Land eine Spalte mit den Wertungen? Das ist nicht sonderlich geschickt, denn mit jedem neuen Land müsstest deine Tabelle anpassen. Besser wäre eine 1:n Beziehung Fahrer-->Wertungen und bei jeder Wertung speicherst die Punkte, das Land und eventuell den Termin des Rennens. Wenn es wirklich so ist, wie du es im Moment versuchst, dann sehen wir mal weiter.
 
Das sieht so aus, als hättest beim Fahrer pro Land eine Spalte mit den Wertungen? Das ist nicht sonderlich geschickt, denn mit jedem neuen Land müsstest deine Tabelle anpassen. Besser wäre eine 1:n Beziehung Fahrer-->Wertungen und bei jeder Wertung speicherst die Punkte, das Land und eventuell den Termin des Rennens. Wenn es wirklich so ist, wie du es im Moment versuchst, dann sehen wir mal weiter.

Es gibt kein neues Land, da es sich um eine Tabelle für Formel 1-Wertungen handelt und es sich nicht groß ändert.
Die Tabelle sieht momentan so aus:
screenshot2wc.png

Da wird dann nur jeweils die Wertung für die einzelnen Strecken aktualisiert.

Wenn GES in der Tabelle wäre, wäre es ein zu großer Aufwand, das auch jedes Mal mit zu aktualisieren, deshalb rechne ich das erst auf der Seite aus.
 
Werbung:
Dann hast du eine Abfrage in der Form
SELECT Fahrer, (AUS+...+BRA) as Gesamtwertung from Formel1.
Eventuell würde ich das dann als View in der DB definieren.
Nun kannst die als Basis (innere Abfrage) für weitere nehmen wie
Dann musst aus der Abfrage das Maximum über die Gesamtwertung nehmen, was nicht mehr eindeutig sein muss, die zwei Besten könnten punktgleich sein, sind sogar alle zu Beginn der Saison vor dem ersten Rennen.
SELECT Max(Gesamtwertung) as Maximum from View.
Dann musst noch die Fehler dazu anzeigen lassen, also
SELECT Fahrer from View where Gesamtwertung = Maximum
Das musst nun vernünftig ineinander schachteln :-)
 
Es gibt kein neues Land, da es sich um eine Tabelle für Formel 1-Wertungen handelt und es sich nicht groß ändert.
Die Tabelle sieht momentan so aus:
screenshot2wc.png

Da wird dann nur jeweils die Wertung für die einzelnen Strecken aktualisiert.

Wenn GES in der Tabelle wäre, wäre es ein zu großer Aufwand, das auch jedes Mal mit zu aktualisieren, deshalb rechne ich das erst auf der Seite aus.
Was sind denn das für Spalten?
Warum hat jeder Fahrer mehrere Länderkennungen? Wozu dienen diese?
 
Ich fürchte, Deine Tabellenkonstruktion taugt nicht. Es geht vermutlich um Rennfahrer?
Dann brauchst Du eine Tabelle "Fahrer" und eine Tabelle "Rennstrecken" und eine Tabelle, in der die Ids der beiden Stammtabellen miteinander in Beziehung gesetzt werden.
Zumindest so ähnlich, ich kenn' mich bei Rennfahrern nicht aus.
 
Werbung:
Ich fürchte, Deine Tabellenkonstruktion taugt nicht.
Das sagte ich ja in meiner ersten Antwort mit der 1:n Beziehung. Aber wenn seine Länder konstant bleiben und er nur an Ländersummen und keinen weiteren Daten zu den Rennen interessiert ist, dann kann er es durchaus auch so machen. Es wird halt immer Probleme geben, wenn er über die Ländergrenzen hinweg statistische Auswertungen machen will. Theoretisch kann er natürlich über eine Union die 1:n-Beziehung auch simulieren *gg*
 
Auch wenn ich das in 2 Tabellen packe, wäre das Problem das gleiche. ;)
Es geht darum, dass der Gesamtstand nicht gespeichert ist, der aber irgendwie verglichen werden muss.

Ich hab das jetzt nochmal umgeschrieben, aber leider wird wieder nichts ausgegeben.
PHP:
<?php  $GES = "SELECT MAX(AUS + MAL + CHN + TUR + ESP + MON + CAN + EUR + GBR + HUN + BEL + ITA + SIN + JPN + KOR + IND + ABD + BRA)                   
FROM `Fahrer_Ergebnisse_Liga1`;";


 $sql = mysql_query("SELECT `Fahrer`                    
FROM `Fahrer_Ergebnisse_Liga1`
WHERE $GES = (SELECT AUS + MAL + CHN + TUR + ESP + MON + CAN + EUR + GBR + HUN + BEL + ITA + SIN + JPN + KOR + IND + ABD + BRA FROM `Fahrer_Ergebnisse_Liga1`;"); 


while ($data = mysql_fetch_assoc($sql))             {
      echo "WM-Fürhrender".$data["Fahrer"].;
} ?>

Theoretisch sollte es doch aber so jetzt funktionieren, oder?
 
Werbung:
Und ich habe dir gesagt, wie du es machen musst. Und ebenfalls empfohlen, erst mal mit dem MySql Admin zu spielen und den Query von innen nach außen Schrittweise aufzubauen.
 
Werbung:
Und ich habe dir gesagt, wie du es machen musst. Und ebenfalls empfohlen, erst mal mit dem MySql Admin zu spielen und den Query von innen nach außen Schrittweise aufzubauen.

So hatte ich das auch, aber es hat nicht wirklich funktioniert. Ich hab es jetzt schon so weit, dass es angezeigt wird, wenn der Gesamtstand in der Tabelle steht - aber das ist nicht das Ziel, weil ich nicht jedes Mal alles neu eingeben will.


Nochmal leicht abgeändert (ohne Gesamtstand in der Tabelle):
PHP:
SELECT AUS + MAL + CHN + TUR + ESP + MON + CAN + EUR + GBR + HUN + BEL + ITA + SIN + JPN + KOR + IND + ABD + BRA AS GES, `Fahrer` FROM `Fahrer_Ergebnisse_Liga1` 
WHERE (

SELECT AUS + MAL + CHN + TUR + ESP + MON + CAN + EUR + GBR + HUN + BEL + ITA + SIN + JPN + KOR + IND + ABD + BRA
FROM `Fahrer_Ergebnisse_Liga1`) = ( 
SELECT MAX( AUS + MAL + CHN + TUR + ESP + MON + CAN + EUR + GBR + HUN + BEL + ITA + SIN + JPN + KOR + IND + ABD + BRA ) 
FROM `Fahrer_Ergebnisse_Liga1` )

Allerdings kommt jetzt folgende Fehlermeldung:
#1242 - Subquery returns more than 1 row

Aber eigentlich dürfte nur eine Zeile kommen, weil einmal 1 Punkt ist und der Rest bei 0.

EndOfGreen: Was willst du überhaupt machen?

Eine kleine Formel 1-Tabelle. Das Problem ist, dass ich den WM-Führenden anzeigen lassen will, es aber ein paar Probleme beim Auswerten gibt.
 
Also ich habe es mit Access und einer vereinfachten Tabelle Ergebnisse (Felder Fahrer, DE, AT, FR) mal nachgebaut. Dann habe ich einen View mit Name Gesamt erstellt, die mir die Fahrer und die Summen anzeigt:

Code:
SELECT Fahrer, AT+DE+FR AS GES FROM Ergebnisse

Basierend darauf habe ich eine Abfrage, die das Gewünschte liefert

Code:
SELECT Fahrer FROM Gesamt where GES = (SELECT Max(GES) from Gesamt)

Das nun noch in einer Abfrage zusammenzuziehen überlass ich dir, wenn du keinen View willst. Und das alles habe ich schon in meiner ersten Antwort so beschrieben.
 
Wie wäre es denn mit ORDER BY?

Quick & dirty:

Code:
SELECT id, name, (AUS+MAL+CHN+TUR+...) AS points
FROM `fahrer`
ORDER BY points DESC
LIMIT 0,1

Oder habe ich das Problem falsch verstanden?

PS: Hast du vor, die Geschichte für die nächste Saison auch noch zu betreiben? Dann kriegst du mit dem Datenbankaufbau in der Tat ein Problem.
 
Werbung:
Das Quick und Dirty entspricht meinem View, gibt aber nur einen Fahrer zurück und man sieht daher nicht, wenn 2 punktgleich das Maximum an Punkten haben. Wenn man das umgehen will, dann muss man wieder mit Where eingrenzen, wobei wir wieder bei meiner Lösung wären.

Davon abgesehen sagen fast alle Kommentare, dass man die DB aufgrund der offensichtlichen Nachteile bei Auswertungen anders aufbauen soll, und eventuell hört er ja. Eine Tabelle mit Fahrer, Datum, Ort und erreichten Punkte und dann kann man Auswertungen nach Lust und Laune machen, ohne diese komische Summenbildung mit +++ im SELECT.
 
Zuletzt bearbeitet:
Oder man gruppiert nach Punkten, vergleicht die Punkte mit dem MAX(points) und gibt die höchstbepunktete Gruppe komplett aus.
 
Werbung:
Zurück
Oben