[MySQL] vorherige Sortierung, danach gruppieren

theHacker

sieht vor lauter Ads den Content nicht mehr
Teammitglied
ID: 69505
L
20 April 2006
22.682
1.316
Moin.
Eine Frage, weil ich mir nicht 100%ig sicher bin, wie sich MySQL verhält.

Gegeben ist eine Tabelle mit UNIX-Timestamps. Nun möchte ich von dieser Tabelle die jeweils erste Zeile, also die mit dem kleinsten Timestamp eines jeden Tags auslesen. Die Tage sollen dann absteigend sortiert sein.

Meine Query lautet:
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] `time`,[B][COLOR=#9932cc]FROM_UNIXTIME[/COLOR][/B][COLOR=#9932cc]([/COLOR]`time`[COLOR=#9932cc])[/COLOR] [B][COLOR=#9932cc]AS[/COLOR][/B] `realtime`,`stuff`
[B][COLOR=#9932cc]FROM[/COLOR][/B] `table` 
[B][COLOR=#9932cc]GROUP[/COLOR][/B] [B][COLOR=#9932cc]BY[/COLOR][/B] [B][COLOR=#9932cc]TO_DAYS[/COLOR][/B][COLOR=#9932cc]([/COLOR][B][COLOR=DarkOrchid]FROM_UNIXTIME[/COLOR][/B][COLOR=DarkOrchid]([/COLOR]`time`[COLOR=#9932cc])[/COLOR][COLOR=DarkOrchid])[/COLOR] [B][COLOR=#9932cc]DESC[/COLOR][/B][/FONT]
Ich bin mir jetzt nur nicht sicher, ob das nur deshalb funktioniert, weil die Einträge zufällig alle chronologisch reingekommen sind oder ob das wirklich korrekt ist.
Es steht ja eigentlich nirgendwo, dass ich den ersten Eintrag haben will :think:

Ich hab mal noch einen zweiten Ansatz mit Self-JOIN probiert. Sobald ich aber irgendwas von Zeit aufsteigend sortieren reinschreib, krieg ich das Ergebnis aufsteigend, was ich ja nicht will.
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] `a`.`time`,[B][COLOR=#9932cc]FROM_UNIXTIME[/COLOR][/B][COLOR=#9932cc]([/COLOR]`a`.`time`[COLOR=#9932cc])[/COLOR] [B][COLOR=#9932cc]AS[/COLOR][/B] `realtime`,`stuff`
[B][COLOR=#9932cc]FROM[/COLOR][/B] `table` [B][COLOR=#9932cc]AS[/COLOR][/B] `a`
[B][COLOR=#9932cc]LEFT[/COLOR][/B] [B][COLOR=#9932cc]JOIN[/COLOR][/B] `table` [B][COLOR=#9932cc]AS[/COLOR][/B] `b` [B][COLOR=#9932cc]USING[/COLOR][/B](`id`)
[B][COLOR=#9932cc]GROUP[/COLOR][/B] [B][COLOR=#9932cc]BY[/COLOR][/B] [B][COLOR=#9932cc]TO_DAYS[/COLOR][/B][COLOR=#9932cc]([/COLOR][COLOR=DarkOrchid][B]FROM_UNIXTIME[/B]([/COLOR]`a`.`time`[COLOR=#9932cc])[/COLOR][COLOR=DarkOrchid])[/COLOR] [B][COLOR=#9932cc]DESC[/COLOR][/B]
[B][COLOR=#9932cc]ORDER[/COLOR][/B] [B][COLOR=#9932cc]BY[/COLOR][/B] `b`.`time` [B][COLOR=#9932cc]ASC[/COLOR][/B][/FONT]
Ok, während ich den Post nochmal durchgelesen hab, is mir noch ne dritte Idee gekommen:
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] [B][COLOR=#9932cc]MIN[/COLOR][/B][COLOR=#9932cc]([/COLOR]`time`[COLOR=#9932cc])[/COLOR] [B][COLOR=#9932cc]AS[/COLOR][/B] `time`,[B][COLOR=#9932cc]FROM_UNIXTIME[/COLOR][/B][COLOR=#9932cc]([/COLOR][COLOR=DarkOrchid][B]MIN[/B]([/COLOR]`time`[COLOR=#9932cc])[/COLOR][COLOR=DarkOrchid])[/COLOR] [B][COLOR=#9932cc]AS[/COLOR][/B] `realtime`
[B][COLOR=#9932cc]FROM[/COLOR][/B] `table`
[B][COLOR=#9932cc]GROUP[/COLOR][/B] [B][COLOR=#9932cc]BY[/COLOR][/B] [B][COLOR=#9932cc]TO_DAYS[/COLOR][/B][COLOR=#9932cc]([/COLOR][COLOR=DarkOrchid][B]FROM_UNIXTIME[/B]([/COLOR]`time`[COLOR=#9932cc])[/COLOR][COLOR=DarkOrchid])[/COLOR] [B][COLOR=#9932cc]DESC[/COLOR][/B]
[B][COLOR=#9932cc]ORDER[/COLOR][/B] [B][COLOR=#9932cc]BY[/COLOR][/B] `time` [B][COLOR=#9932cc]DESC[/COLOR][/B][/FONT]
Allerdings bräuchte ich dann hier noch eine weitere Abfrage, in der ich zur Minimalzeit noch den Rest der Zeile abrufe.

Was is richtig ? Was is am besten :?:
 
Meine Query lautet:
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] `time`,[B][COLOR=#9932cc]FROM_UNIXTIME[/COLOR][/B][COLOR=#9932cc]([/COLOR]`time`[COLOR=#9932cc])[/COLOR] [B][COLOR=#9932cc]AS[/COLOR][/B] `realtime`,`stuff`
[B][COLOR=#9932cc]FROM[/COLOR][/B] `table` 
[B][COLOR=#9932cc]GROUP[/COLOR][/B] [B][COLOR=#9932cc]BY[/COLOR][/B] [B][COLOR=#9932cc]TO_DAYS[/COLOR][/B][COLOR=#9932cc]([/COLOR][B][COLOR=DarkOrchid]FROM_UNIXTIME[/COLOR][/B][COLOR=DarkOrchid]([/COLOR]`time`[COLOR=#9932cc])[/COLOR][COLOR=DarkOrchid])[/COLOR] [B][COLOR=#9932cc]DESC[/COLOR][/B][/FONT]
Ich bin mir jetzt nur nicht sicher, ob das nur deshalb funktioniert, weil die Einträge zufällig alle chronologisch reingekommen sind oder ob das wirklich korrekt ist.
Es steht ja eigentlich nirgendwo, dass ich den ersten Eintrag haben will :think:
Bin mir ziemlich sicher, dass hier immer die Werte der ersten Zeile mit dem entsprechenden Timestamp genommen werden, nicht-chronologische Eintragung würde also nicht zu dem gewünschten Ergebnis führen.

Ok, während ich den Post nochmal durchgelesen hab, is mir noch ne dritte Idee gekommen:
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] [B][COLOR=#9932cc]MIN[/COLOR][/B][COLOR=#9932cc]([/COLOR]`time`[COLOR=#9932cc])[/COLOR] [B][COLOR=#9932cc]AS[/COLOR][/B] `time`,[B][COLOR=#9932cc]FROM_UNIXTIME[/COLOR][/B][COLOR=#9932cc]([/COLOR][COLOR=DarkOrchid][B]MIN[/B]([/COLOR]`time`[COLOR=#9932cc])[/COLOR][COLOR=DarkOrchid])[/COLOR] [B][COLOR=#9932cc]AS[/COLOR][/B] `realtime`
[B][COLOR=#9932cc]FROM[/COLOR][/B] `table`
[B][COLOR=#9932cc]GROUP[/COLOR][/B] [B][COLOR=#9932cc]BY[/COLOR][/B] [B][COLOR=#9932cc]TO_DAYS[/COLOR][/B][COLOR=#9932cc]([/COLOR][COLOR=DarkOrchid][B]FROM_UNIXTIME[/B]([/COLOR]`time`[COLOR=#9932cc])[/COLOR][COLOR=DarkOrchid])[/COLOR] [B][COLOR=#9932cc]DESC[/COLOR][/B]
[B][COLOR=#9932cc]ORDER[/COLOR][/B] [B][COLOR=#9932cc]BY[/COLOR][/B] `time` [B][COLOR=#9932cc]DESC[/COLOR][/B][/FONT]
Allerdings bräuchte ich dann hier noch eine weitere Abfrage, in der ich zur Minimalzeit noch den Rest der Zeile abrufe.
So hätte ich das angegangen, zur mittleren Idee kann ich gerade leider nichts sagen. Die zweite Abfrage sollte sich mittels Subselects vermeiden lassen, oder soll es MySQL 3.x-kompatibel sein? Vielleicht klappt es aber auch mit einem JOIN, musst du mal probieren ;)

Gruß,
MrToiz
 
Wenn du Dir nicht sicher bist mit deinem ersten Query kannst du auch einfach einen per Hand einfügen am ende oder mittendrin wenns machbar ist mit 12 sekunden dann sollte der 1.1.1970 rauskommen. Oder habsch was net verstanden?