MySQL - Abfrage / Sortieren ... immer noch Problem
Niklas
- php
Hallo,
habe immer noch ein Problem mit meiner Abfrage:
SELECT name, MAX(kontostand) as kontostand, datum FROM $mysql_name_tabelle GROUP BY name ORDER BY kontostand desc, datum desc LIMIT 0,1
Die Abfrage soll eine Liste sortiert nach höchstem Kontostand, und dann nach Datum ausgeben, wobei von jedem Benutzer (name) immer nur der höchste Kontostand angezeigt werden soll.
Wenn ich das so wie oben mache klappt es zwar, aber ich komme nicht an das Datum ran ... hab was von Unterabfragen gehört ... mit meiner SQL-Version läuft das, aber ich verstehe das nicht bzw. krieg es nicht hin.
Könnte mir nochmal wer helfen, bitte?
Danke ...
Niklas
Hello,
SELECT name, MAX(kontostand) as kontostand, datum FROM $mysql_name_tabelle GROUP BY name ORDER BY kontostand desc, datum
Die Abfrage soll eine Liste sortiert nach höchstem Kontostand, und dann nach Datum ausgeben, wobei von jedem Benutzer (name) immer nur der höchste Kontostand angezeigt werden soll.
So müsste es doch gehen.
Mit limit 0,1 würde ja vom gesamten Ergebnis nur ein Satz ausgegeben werden.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
es sollen die Top 10 ausgegeben werden ... somit LIMIT 0,10 ... aber das andere Problem krieg ich nicht hin :-((
N.
Hello,
SELECT name, MAX(kontostand) as kontostand, datum FROM $mysql_name_tabelle GROUP BY name ORDER BY kontostand desc, datum
funktioniert bei mir ganz prima.
Allerdings heißt mein Statement
SELECT NAME, MAX(ZAHLUNG) as Z, DATUM FROM MONEY GROUP BY NAME ORDER BY Z desc, DATUM;
-----
Vielleicht sitzt da der Bock?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hallo,
SELECT NAME, MAX(ZAHLUNG) as Z, DATUM FROM MONEY GROUP BY NAME ORDER BY Z desc, DATUM;
Das Problem ist, dass im Feld Datum nur zufällig das Datum stehen kann, welches zum Max(ZAHLUNG) gehört. Da DATUM weder zur Gruppierung gehört, noch in einer Aggregatfunktion steht, wird von MySQL einfach irgendein DATUM aus der Gruppe als Wert eingesetzt.
Beispiel
NAME ZAHLUNG DATUM
Maier 100 2004-01-01
Maier 200 2004-02-01
Maier 300 2004-03-01
Maier 100 2004-04-01
Maier 200 2004-05-01
Hier würde die Query
SELECT NAME, MAX(ZAHLUNG) as Z, DATUM FROM MONEY GROUP BY NAME ORDER BY Z desc, DATUM;
als Ergebnis-Datenmenge beispielsweise ergeben:
NAME Z DATUM
Maier 300 2004-05-01
Es gibt keinen Grund, welcher das DATUM auf den 1. März zwingen würde.
Es gibt hier, meiner Meinung nach auch keine sinnvolle Abfrage, die diese Werte in _einer_ Abfrage ermittelt. Man müsste nämlich in einem Subselect den datensatz auswählen, bei dem ZAHLUNG = Z und NAME = [DieserNAME] ist. Das wird so nicht gehen.
Also:
Ein Select:
SELECT NAME, MAX(ZAHLUNG) as Z FROM MONEY GROUP BY NAME ORDER BY Z desc;
und dann in der Auswertungsschleife mitjeweils noch einem Select das Datum holen, bei dem ZAHLUNG = Z und NAME = [DieserNAME].
viele Grüße
Axel
Hello,
ich glaube, dass da sowieso ein Denkfehler drinsteckt.
Wenn ich über den Namen gruppiere und aus der jeweiligen Gruppe dann immer den größten Kontostand ermittele, habe ich sowieso schon nur noch eine Zeile Pro Name.
Diese Ergenbismenge kann ich nun entweder nach dem Namen, nach dem Kontostand, nach dem Datum im primären Sortierglied sortieren lassen.
Bei der Sortierung über den Kontostand würde eine nachrangige Sortierung über das Datum nur noch Effekt haben, wenn zwei Kontoinhaber den gleichen Kontostand haben. Dann würde eben der, bei dem der Kontostand später maximal wurde, nicht mehr an erster Stelle der 'Gruppe Kontostand' stehen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
yo,
Könnte mir nochmal wer helfen, bitte?
SELECT name, MAX(kontostand) AS kontostand, MAX(datum) AS Datum
FROM $mysql_name_tabelle AS tab1
WHERE datum = (SELECT max(datum) FROM $mysql_name_tabelle AS tab2 WHERE tab2.name = tab1.name)
GROUP BY n1
ORDER BY kontostand desc, datum desc
LIMIT 0,10
Ilja
Hello,
Könnte mir nochmal wer helfen, bitte?
SELECT name, MAX(kontostand) AS kontostand, MAX(datum) AS Datum
FROM $mysql_name_tabelle AS tab1
WHERE datum = (SELECT max(datum) FROM $mysql_name_tabelle AS tab2 WHERE tab2.name = tab1.name)
GROUP BY n1
ORDER BY kontostand desc, datum desc
LIMIT 0,10
So gehört doch aber der Kontostand nicht mehr zum Datum. War das so gemeint?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
yo,
So gehört doch aber der Kontostand nicht mehr zum Datum. War das so gemeint?
nein, habe die falsche spalte in der unterabfrage angegeben. danke für den hinweis Tom.
SELECT name, MAX(kontostand) AS kontostand, MAX(datum) AS Datum
FROM $mysql_name_tabelle AS tab1
WHERE kontostand = (SELECT max(kontostand) FROM $mysql_name_tabelle AS tab2 WHERE tab2.name = tab1.name)
GROUP BY n1
ORDER BY kontostand desc, datum desc
LIMIT 0,10
Ilja
yo,
und noch einen verschreiber....nicht GROUP BY n1, sondern GROUP BY name. ich hatte vorher noch einen alias zu stehen, den ich dann aber vor dem abschicken gelöscht habe.
Ilja
Hallo,
SELECT name, MAX(kontostand) AS kontostand, MAX(datum) AS Datum
FROM $mysql_name_tabelle AS tab1
WHERE kontostand = (SELECT max(kontostand) FROM $mysql_name_tabelle AS tab2 WHERE tab2.name = tab1.name)
GROUP BY n1
ORDER BY kontostand desc, datum desc
LIMIT 0,10
Ja, das ist eine gute Idee, geht aber einfacher:
SELECT name, kontostand, datum
FROM $mysql_name_tabelle AS tab1
WHERE kontostand = (SELECT max(kontostand) FROM $mysql_name_tabelle AS tab2 WHERE tab2.name = tab1.name)
ORDER BY kontostand desc, datum
LIMIT 0,10
viele Grüße
Axel
yo,
Ja, das ist eine gute Idee, geht aber einfacher:
SELECT name, kontostand, datum
FROM $mysql_name_tabelle AS tab1
WHERE kontostand = (SELECT max(kontostand) FROM $mysql_name_tabelle AS tab2 WHERE tab2.name = tab1.name)
ORDER BY kontostand desc, datum
LIMIT 0,10
nein, das geht imho nicht. das gibt probleme, wenn mehrere datensätze den gleichen wert für die spalten name und kontostand haben.
Ilja
Hallo,
SELECT name, kontostand, datum
FROM $mysql_name_tabelle AS tab1
WHERE kontostand = (SELECT max(kontostand) FROM $mysql_name_tabelle AS tab2 WHERE tab2.name = tab1.name)
ORDER BY kontostand desc, datum
LIMIT 0,10
nein, das geht imho nicht. das gibt probleme, wenn mehrere datensätze den gleichen wert für die spalten name und kontostand haben.
Ja, die stehen dann mehrfach im Ergebnis. Also geht es so nur, wenn das ausgeschlossen ist. Beispielsweise, wenn der Kontostand nur steigen kann, was zwar wünschenswert, aber nicht realistisch ist ;-)).
Du hast also Recht.
viele Grüße
Axel