MySql sortieren
niklas
- php
Hallo,
habe eine MySql-Tabelle mit den Spalten name, kontostand, datum.
Diese möchte ich jetzt so ausgeben, dass an Position 1 derjenige steht, der den höchsten Kontostand hat, gibt es Namen mit gleichem Kontostand soll nach dem datum absteigend sortiert werden. Es sollen nur die Top Ten ausgegeben werden
Weiterhin sollen keine Namen doppelt in der Liste erscheinen, d.h. wenn Mr.X zwar die uehn besten Kontostände von allen hat, soll trotzdem nur sein höchster angezeigt werde und dann wieder die anderen namen.
Ih habe es so probiert - aber es gibt immer noch doppelte einträge ...
select name,kontostand,UNIX_TIMESTAMP(datum) as datum_unix from $mysql_name_tabelle order by kontostand desc, datum desc limit 0,10
Danke an Euch!
Niklas M.
Hallo Niklas,
ich bin zwar in MySQL nicht so fit, aber ich fürchte das du dass mit einer MySQL Abfrage allein nicht hinbekommst.
Die schnellste Lösung die mir einfällt, ist bei der Auswertung der MySQL Daten mit PHP (anzunehmenderweise in einer while-Schleife?) die ungewollten Datensätze einfach auszusortieren.
Wenn irgendwas dagegen spricht, es so zu machen, kann ich dir wohl nicht weiterhelfen, aber wenn du Hilfe bei der PHP Auswertung brauchst, einfach nochmal posten.
Gruss, marcus.
Niklas M.,
..mit 'destinct' sollte es klappen. Also etwa:
select destinct name,kontostand,UNIX_TIMESTAMP(datum) as datum_unix from $mysql_name_tabelle order by kontostand desc, datum desc limit 0,10
Gruß Peter :-)
select destinct name,kontostand,UNIX_TIMESTAMP(datum) as datum_unix from $mysql_name_tabelle order by kontostand desc, datum desc limit 0,10
mmmmh ... wenn ich das so mache bekomme ich einen Fehler ... :-(((
hi,
mmmmh ... wenn ich das so mache bekomme ich einen Fehler ... :-(((
aha.
gruß,
wahsaga
yo,
..mit 'destinct' sollte es klappen. Also etwa:
DISTINCT heisst es, da wird auch der fehler herkommen. zum anderen bringt hier ein DISTINCT rein gar nichts, da nur doppelte datensätze aussortiert werden, die über den gesamten datensatz gleich sind und nicht nur über den namen.
was du brauchst ist eine gruppierung über die namen, die sortierung und das limit wie gehabt. beachte dabei, dass alle anzuzeigenende spalten bei einer gruppierung entweder in der gruppierung stehen müssen oder aber in einer aggregat-funktion.
Ilja
Hallo Ilja,
was du brauchst ist eine gruppierung über die namen, die sortierung und das limit wie gehabt. beachte dabei, dass alle anzuzeigenende spalten bei einer gruppierung entweder in der gruppierung stehen müssen oder aber in einer aggregat-funktion.
Danke für die Erklärung, aber soweit reichen meine bescheidenen Kenntnisse nicht aus ... kannst Du mir da helfen.
Bitte, bitte :-)))
Niklas
yo,
SELECT name, MAX(kontostand)
FROM tabelle
ORDER BY kontostand, datum
LIMIT 0,10
Ilja
SELECT name, MAX(kontostand)
FROM tabelle
ORDER BY kontostand, datum
LIMIT 0,10
sorry, aber das tuts nicht .... n.
yo,
sorry, aber das tuts nicht .... n.
was genau passiert den, bzw. was passiert nicht ? ich vermute mal die sortierung könnte probleme machen.
Ilja
Hallo,
sorry, aber das tuts nicht .... n.
was genau passiert den, bzw. was passiert nicht ? ich vermute mal die sortierung könnte probleme machen.
Nö, Du hast das GROUP BY vergessen.
viele Grüße
Axel
PS: An das zum Max(kontostand) passende Datum kommt er aber mit Hilfe einer Abfrage ohnehin nicht ran.
yo,
Nö, Du hast das GROUP BY vergessen.
ja, das habe ich einfach im eifer des gefechts unterschlagen. dane für den hinweis.
PS: An das zum Max(kontostand) passende Datum kommt er aber mit Hilfe einer Abfrage ohnehin nicht ran.
sag niemals nie. erst mal ist es wichtig, dass die erste query ohne datum bei ihm geht. dann binden wir noch das datum dazu ein. das wird aber ein wenig komplizierter, aber es sollte machbar sein.
Ilja
Hi,
ich kriege schlichtweg einen MySQL-Fehler.
Also so siehts aus, wenn ichs anpasse:
select name,max(kontostand),UNIX_TIMESTAMP(datum) as datum_unix from $mysql_name_tabelle order by kontostand desc, datum desc limit 0,$topliste_anzahl
so sieht meine Tabelle aus:
CREATE TABLE $mysql\_name\_tabelle
(
id
int(11) unsigned NOT NULL auto_increment,
name
varchar(100) NOT NULL default '',
kontostand
decimal(10,2) NOT NULL default '0.00',
datum
datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id
)
) TYPE=MyISAM AUTO_INCREMENT=28 ;
Hilfst Du mir bitte nochmal?
Die ausgabe soll so aussehen: Auf Platz eins soll also derjenige stehen, der die meisten Punkte hat, wenn mehrer Personen die meisten Punkte haben, dann soll nach dem Datum sort werden. Weiterhin sollen von jedem namen nur die maximal punktzahl in der liste erscheinen.
Vielen Dank!!!
N.
yo,
ich kriege schlichtweg einen MySQL-Fehler.
wie axel bereits gesagt hat, habe ich das GROUP BY zwar vorgeschlagen, aber dann in der query vergesen anzugeben.
SELECT name, MAX(kontostand)
FROM tabelle
GROUP BY name
ORDER BY kontostand, datum
LIMIT 0,10
versuch das mal. wenn es zu schwierigkeiten kommt, immer den fehler mit angeben, bzw. das resultat.
Ilja
Guten Morgen !
das klappt zwar jetzt so ohne Fehler, aber die Verbindung zum datum funktioniert nicht ... das datum wird nicht berücksichtigt ... ???
Gibts da noch ne Möglichkeit?
So siehts bis jetzt aus
SELECT name, MAX(kontostand) as kontostand, datum FROM $mysql_name_tabelle GROUP BY name ORDER BY kontostand desc, datum desc LIMIT 0,10
Niklas
yo morgen,
das klappt zwar jetzt so ohne Fehler, aber die Verbindung zum datum funktioniert nicht ... das datum wird nicht berücksichtigt ... ???
erst mal war es wichtig, dass der erste schritt klappt. das datum mit einzubinden ist ein wenig tricky. so wie die query im moment ist, kannst du das datum nicht einfach mit ausgeben. aber sie sollte sehr wohl das datum bei dem ORDER BY berücksichtigen. um nun das datum einbinden zu können, wolte ich vorher noch fragen, ob du eine neuere version von mysql hast, was unterabfragen akzeptiert ?
Ilja