MySQL GROUP BY nach JOINs Bestenliste

eracer

Grünschnabel
MySQL 5.1

Ich habe folgendes Problem mit meiner MySQL Abfrage in PHP:

Aus meiner Tabelle "Performances" (Wettkampfresultate) möchte ich die 10 schnellsten
anzeigen. Per JOIN hole ich aus der Teilnehmertabelle die Namen der Teilnehmer. Da die Wettkampfresultate aus mehreren Jahren sind, möchte ich pro Teilnehmer aber nur seine beste Zeit anzeigen (Bestenliste).

Nun sollte man meinen, dass dies mit GROUP BY ohne weiteres möglich ist. Naja, aber aus irgend einem Grund geht es eben doch nicht. Ohne GROUP BY funktioniert meine Abfrage hervorragend, jedoch sind halt Teilnehmer (Athletes) doppelt genannt.

Hier der Code:

PHP:
SELECT  
		athletes.AthleteID, 
		RIGHT(performances_lc.PerfTime,8) AS Time,
                 performances_lc.Meet,
		performances_lc.TimeType,
		athletes.GivenName,
		athletes.Surname,
		LEFT(athletes.Birthdate,4) AS DoB,
		athletes.Club,
                athletes.CountryCode                   
           FROM
                  athletes        
	LEFT JOIN 
		 performances_lc
		ON 
		 performances_lc.AthleteID = athletes.AthleteID
	WHERE 
		 performances_lc.EventID = '59'
	GROUP BY
		athletes.GivenName
	ORDER BY
		performances_lc.PerfTime,
		performances_lc.TimeType

Die Abfrage mit GROUP BY ergibt ein sehr eigenartiges Ergebnis: Fast willkürlich werden die Teilnehmer angezeigt.

Mir fällt nichts mehr ein, nachdem ich alle Kombinationen von JOINs und Unterabfragen probiert habe.
 
Hallo

Mich verwunderts, dass in der group by Anweisung nur ein Felde des select's steht. ich führe dort immer alle felder auf, ansonsten spuckt es nur so mit Fehlermeldungen.
 
Hallo

Mich verwunderts, dass in der group by Anweisung nur ein Felde des select's steht. ich führe dort immer alle felder auf, ansonsten spuckt es nur so mit Fehlermeldungen.

Öhm wenn du alle Felder in das GROUP BY packst die du im SELECT stehen hast, kannst du das GROUP BY auch weglassen und stattdessen ein SELECT UNIQUE benutzen (wenn ich gerade nicht falsch denke).

Alles in ein GROUP BY zu packen ist nicht der Sinn und Zweck einer Gruppierung.

Fehlermeldungen lesen und verstehen ist besser als sie einfach irgendwie nur versuchen wegzubekommen.


Zu der eigentlichen Frage:

Wenn du die Beste Zeit haben möchtest müsste dass ja die minimale Zeit sein. Wenn deine Zeiten korrekt mit Typ TIME in der Datenbank eingetragen sind müsste folgendes gehen:
SQL:
SELECT  
        athletes.AthleteID, 
        MIN(performances_lc.PerfTime) AS Time,
                 performances_lc.Meet,
        performances_lc.TimeType,
        athletes.GivenName,
        athletes.Surname,
        LEFT(athletes.Birthdate,4) AS DoB,
        athletes.Club,
                athletes.CountryCode                   
           FROM
                  athletes        
    LEFT JOIN 
         performances_lc
        ON 
         performances_lc.AthleteID = athletes.AthleteID
    WHERE 
         performances_lc.EventID = '59'
    GROUP BY
        athletes.GivenName

Immer daran denken dass es eine bestimmte Reihenfolge bei der Ausführung von Anfragen gibt:
1. from
2. where
3. group by
4. having
5. select
6. order by

In deiner Anfrage wird als nach name gruppiert und da nicht ausgesagt ist welche der Zeiten genommen werden soll wird die erste genommen. Erst danach wird sortiert und zwar nach Zeiten wie es bei dir angegeben ist.

Was du aber willst ist die minimale Zeit eines Athleten zu bekommen. Daher kannst du nach Name gruppieren und davon dann die minimale Zeit auswählen. Wenn du willst dann auch nachträglich noch einmal nach Zeit sortieren, dann bekommst du eine Rangliste der schnellsten Athleten.
 
Yes, thats it.

Danke für die schnelle Antwort. Ich könnte mich ärgern, das ich da nicht selber drauf gekommen bin.

Aber. Da ich in der Abfrage auch das Meet (z.B. Olympia) abfrage, stehen nun leider zu den angezeigten Zeiten die falschen Meets. Sprich: Die angezeigte Zeit wurde nicht zu diesem Meet aufgestellt, sondern zu einem anderen (z.B. Europameisterschaften).
 
Meet kommt natürlich von Meeting. Ist die engl. Kurzform. Das was du meinst ist Meat = Fleisch.:-)

Aber zurück zu MySQL: Nein die richtige Gruppierung mit den dazugehörigen Details ist mir noch nicht gelungen. Trotdem Danke für den Tipp.;)
 
Ich kann durchaus englisch. Vom klang her ist es aber nunmal das selbe und klingt witzig: Bei welchem Fleisch hattest du die beste Zeit? Klingt mehr nach Wettessen.

Wie auch immer. Wenn du mir ein paar Daten aus der Datenbank hier reinstellst dann kann ich ja nochmal gucken wie die Anfrage aussehen muss damit du das gewünschte Ergebnis erhältst.

Am besten als SQL Script reinstellen damit ich damit keine Arbeit mehr habe. Alles sehr knapp und stressig vor Weihnachten ;)
 
Ja, Weihnachten. Wenig Zeit , ja geht mir ähnlich.
Sobald ich das Problem gelöst habe, werde ich es posten.

Hier nochmal das Problem:

Folgende MySQL Abfrage funktioniert soweit, aber, die angezeigten Wettkämpfe (Meet) passen nicht zur Zeit.

Sobald also die beste Zeit ermittelt wurde, muss auch der Wettkampf bei dem sie aufgestellt wurde "festgehalten" werden. Die GROUP BY Funktion bringt aber irgendeinen Wettkampf des Athleten zur anzeige.


SQL:
SELECT  
				  MIN(p.PerfTime) AS Time,
                  p.Meet,
				  p.TimeType,
                  a.GivenName,
				  a.Surname,
				  LEFT (a.Birthdate,4) AS DoB,
				  a.Club,
                  a.CountryCode                   
           FROM
                  athletes AS a      
		   LEFT JOIN 
		   		 (performances_lc AS p, timetypes AS tt)
				 ON 
				 (p.AthleteID = a.AthleteID 
				 AND
				 p.TimeType = ttCode)
			
		   WHERE 
				 p.EventID = '59'
			GROUP BY
				a.GivenName,
				a.Surname
			ORDER BY
				Time,
				ttID	  
			LIMIT 
				0, 10
 
Zuletzt bearbeitet von einem Moderator:
Zurück