PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Group By Problem


Lurchi
23.06.2009, 19:47:23
Hey ihr,

ich versuche nun schon seit mehreren Stunden eine wahrscheinlich recht simple Abfrage zu machen, jedoch komme ich nicht auf den grünen Zweig.

Meine Datenbank ist wie folgt aufgebaut.


Name Ort Tele Geld
Bella B. Dresden 345234 18000
Armin A. Dresden 111176 25000
Charlie C. Berlin 033444 31001
DagobertD. Berlin 0 561
Emil E. Köln 8115 36638
Franz F. Chemnitz 557 25467


Nun möchte ich eigentlich nur dass die reichsten Leute einer Stadt angezeigt werden.Die Tabelle müßte dann nach meinen Vorstellungen so aussehen.


Name Ort Tele Geld
Emil E. Köln 8115 36638
Charlie C. Berlin 033444 31001
Franz F. Chemnitz 557 25467
Armin A. Dresden 111176 25000


Also von jeder Stadt der reichste Absteigend sortiert, mein Sql Befehl ist:
SELECT Name,Ort,max(Geld)as Geld FROM `test` group by Ort ORDER BY `Geld` DESC

Jedoch kommt dann das raus
Name Ort Tele Geld
Emil E. Köln 8115 36638
Charlie C. Berlin 033444 31001
Franz F. Chemnitz 557 25467
Bella B. Dresden 345234 25000



Das ist jedoch nicht richtig, wo liegt nun mein Denkfehler und wie kann ich zu dem gewünschten Ergebnis kommen ?

Schonmal vielen Dank für die Hilfe und schönen Abend noch :)

Crisps
24.06.2009, 11:12:20
SELECT Name
, Ort
, MAX(Geld) AS Geld
FROM `test`
GROUP
BY Ort
ORDER
BY `Geld` DESC

Mit dieser Abfrage gruppierst du nur die Einträge anhand des Orts. MAX(Geld) selektiert dann den jeweilig höchsten Betrag pro Ort aus. Allerdings kann die Abfrage ja nicht wissen, dass der 'richtige' User (der mit dem höchsten Beitrags assoziiert ist) gewünscht wird.

So sollte es funktionieren:
SELECT t.Name
, t.Ort
, t.Tele
, t.Geld
FROM ( SELECT MAX(Geld) AS maxgeld
FROM test
GROUP
BY Ort ) AS ts
INNER
JOIN test AS t
ON t.Geld = ts.maxgeld
ORDER
BY t.Geld DESC;
Die Subquery sucht den höchsten Geldbetrag pro Ort aus, und Joined diesen Betrag dann wieder mit derselben Tabelle um auch noch den Namen, Ort und Telefonnummer des Users abzurufen.

Ich hoffe, meine Erklärung macht einigermaßen Sinn. Ich schreibe nämlich lieber Abfragen, als das ich sie erkläre. :D

Lurchi
24.06.2009, 12:40:22
Hey danke schonmal für die Schnelle Hilfe das mit dem Join und Unterabfrage muss ich mir nochmal genau durchlesen !Nun habe ich nur noch das Problem dass er mit ihrer Abfrage bei einigen Testreihen doppelte Ergebnisse erzielt.

Wenn ich z.b den letzten Eintrag in der Tabelle auch auf 25000 mache dann kommt er irgendwie total durcheinander.

Also die Ausgangstabelle sieht dann so aus


Name Ort Tele Geld
Bella B. Dresden 345234 18000
Armin A. Dresden 111176 25000
Charlie C. Berlin 033444 31001
DagobertD. Berlin 0 561
Emil E. Köln 8115 36638
Franz F. Chemnitz 557 25000

Franz F hat nun so viel Geld wie Armin A. eigentlich sollten die Beiden ja nun untereinander stehen aber nach meiner Abfrage kommt das raus.



Name Ort Tele Geld
Emil E. Köln 8115 36638
Charlie C. Berlin 033444 31001
Franz F. Chemnitz 557 25000
Armin A. Dresden 111176 25000
Armin A. Dresden 111176 25000
Franz F. Chemnitz 557 25000



Woran kann das liegen ?


MfG Lurchi

Crisps
24.06.2009, 12:58:14
Versuchs mal mit DISTINCT:
SELECT DISTINCT
t.Name
, t.Ort
, t.Tele
, t.Geld
FROM ( SELECT MAX(Geld) AS maxgeld
FROM test
GROUP
BY Ort ) AS ts
INNER
JOIN test AS t
ON t.Geld = ts.maxgeld
ORDER
BY t.Geld DESC;

Lurchi
24.06.2009, 13:53:17
Hey danke distinct hat nicht geholfen, zumindest nur in diesem einen speziellen Fall :).
Ich musste nur nach dem Join nochmal
"
GROUP
BY Ort
"
setzen ...try&error halt :D

vielen Dank für die Hilfe :)