[SQL] Maximum spielt verrückt?

NemesisFS

Lt. Commander
Registriert
Sep. 2008
Beiträge
1.295
Hi,

ich habe die Aufgabe, für eine Beispieldatenbank Queries zu schreiben. Dabei bin ich auf ein Problem gestossen, dass ich mir nicht erklären kann. Ich soll die Mannschaft ausgeben, die die meisten ausländischen Spieler im Kader hat.
Als Art Zwsichenergebnis habe ich nun die Mannschaften mit der Anzahl an ausländischen Spielern:
Code:
SELECT team_id, name, players FROM team NATURAL JOIN (SELECT team_id, COUNT(team_id) AS players FROM spieler WHERE nationalitaet != 'deutsch' GROUP BY team_id) ORDER BY players DESC;
3|Bayern Muenchen|2
2|Borussia Dortmund|1
5|Hamburger SV|1
(die ID ist da nicht wichtig, sollte aber auch nicht stören)
Wenn ich nun das Maximum bestimme, erhalte ich folgendes:
Code:
SELECT team_id, name, MAX(players) FROM team NATURAL JOIN (SELECT team_id, COUNT(team_id) AS players FROM spieler WHERE nationalitaet != 'deutsch' GROUP BY team_id) ORDER BY players DESC;
5|Hamburger SV|2
Was so einfach falsch ist, habe es per Hand nachgeprüft. Hat jemand eine Idee, woran das liegen könnte? Auf Nachfrage kann ich auch die Datenbank posten, zum testen benutze ich sqlite 3.7.3

Hoffe ihr könnt mir weiterhelfen =)

LG, nemesis
 
SQL funktioniert nicht so. max nimmt einen Vektor und gibt das maximale Element zurueck. Dieses maximale Element haengt nicht mehr mit einer bestimmten Zeile zusammen.

http://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column

Du musst zuerst das Maximum finden, und dann die Zeilen SELECTen wo die Spielerzahl diesem Maximum enspricht.

Edit: Oder einfacher, sortieren und nur die erste Zeile waehlen, falls du nur ein maximales Element benoetigst. Wenn du alle Maxima brauchst, musst du obigen Ansatz waehlen.
 
Zuletzt bearbeitet:
Ah, jetzt wird so einiges klarer! Vielen Dank!
 
Schau dir dazu auch mal die HAVING Klausel an.
 
Bin jetzt auf folgende Anfrage gekommen, ist das unnötig kompliziert?
Code:
SELECT name FROM 
		team 
	NATURAL JOIN (
		SELECT team_id, COUNT(team_id) AS players FROM spieler 
		WHERE nationalitaet != 'deutsch' GROUP BY team_id
	) 
WHERE players = (
	SELECT MAX(players) FROM 
		team 
	NATURAL JOIN (
		SELECT team_id, COUNT(team_id) AS players FROM spieler 
		WHERE nationalitaet != 'deutsch' GROUP BY team_id
	)
);
 
Ja, diese Loesung ist zu kompliziert. Schau dir meinen Link an.

Er joint dort die ganze Tabelle mit einer Tabelle wo bei der Spieleranzahl immer die maximale Spieleranzahl steht,
und fordert, dass die Spieleranzahl mit dieser maximalen Spieleranzahl uebereinstimmen soll.

Zeilen welche diese Bedinung nicht erfuellen sind nicht Teil der resultierenden Tabelle.

Ich wuerde noch einmal genau nachlesen wie (INNER) JOIN, LEFT/RIGHT/ OUTER JOIN etc. definiert sind und erst mal auf NATURAL JOIN verzichten, bis du genau verstehst was der Automatismus in NATURAL JOIN wirklich macht.
 
Zurück
Oben