Forum: PC-Programmierung mySQL - die letzten X Werte


von Markus J. (mjay)


Lesenswert?

Moinsen!

Ich möchte aus meiner Datenbank die letzten X Werte rausbekommen (288, 
um genau zu sein ;) ).

Mit
1
select id, adc1 from `testtabelle` order by id desc limit 288
wäre die Aufgabe ja eigentlich schon erfüllt, aber ich hätte sie gerne 
in aufsteigender Reihenfolge.

Deswegen habe ich es (unter anderem) so versucht:
1
select id, adc1 from `testtabelle` where id in (SELECT id FROM `testtabelle` order by id desc limit 288) order by id

Das geht aber nicht. Als Meldung kommt:
1
#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
mySQL Version ist die 5.0.51a

Ich könnte nun natürlich meine Auswerteschleife einfach umdrehen, das 
würde eigentlich auch nicht viel verändern. Aber es wurmt mich, dass ich 
es nicht schaffe, die Werte wie gewünscht mit EINER sql-Abfrage zu 
bekommen.
Gibt es da eine Möglichkeit?

Gruß...
...Markus

von Ginegt (Gast)


Lesenswert?

Markus J. schrieb:
> Gibt es da eine Möglichkeit?

Wenn du vorher weißt, wieviele Einträge existieren:

Select ... Limit 5000, 288

von moepmoep (Gast)


Lesenswert?

Wie wärs mit ASC anstatt DESC?

Oder verstehe ich deine Frage nicht?

von moepmoep (Gast)


Lesenswert?

oder:

select
    id, adc1
from
    `testtabelle`
where
    id >= (select max(id)-288 from `testtabelle`)
order by
 ... .... ...

von Markus J. (mjay)


Lesenswert?

Hm, ich hab' meine Frage wohl nicht ganz richtig formuliert. ;)

Bei 'asc' hätte ich ja die Werte mit der id 1-288 (wenn man annimmt, 
dass alle ids fortlaufend exisitieren), ich möchte aber die zuletzt 
eingetragenen Werte haben - und da insgesamt 288 Stück. Ob es schlau 
ist, da nach der id zu gehen, lassen wir mal dahingestellt. ;)

Bei 'desc' mit 'limit 288' habe ich die Werte, die ich möchte, aber sie 
sind in der Ausgabe natürlich auch absteigend sortiert. Diese Werte 
möchte ich nun nochmal aufsteigend sortieren, damit ich den ersten Wert 
in meinem Array habe und nicht den Letzten.

Wie viele Einträge existieren, weiss ich nicht. Könnte ich natürlich 
rausfinden, wäre aber wieder eine sql-Abfrage mehr. Und ich will das in 
EINER hinbekommen. ;)

von moepmoep (Gast)


Lesenswert?

kannst du die tabelle nicht um eine spalte erweitern und da einen 
timestamp eintragen? dann kannst du sehr einfach die letzten 288 werte 
selektieren...
gute n8

von Markus J. (mjay)


Lesenswert?

@moepmoep: Das funktioniert (mit max(id)-287 ;) ), solange ich wirklich 
fortlaufende ids habe. Allerdings kann es vorkommen, dass zwischendurch 
mal was fehlt.

EDIT, weil moepmoep schneller war:
noch mal @moepmoep: Ein Timestamp macht definitiv Sinn, da ich die Werte 
der letzten 24 Stunden in meiner Grafik haben will. Und wenn mal einer 
fehlen sollte, sollte ich den eh interpolieren oder mir irgendwas 
anderes überlegen.
Im Moment möchte ich aber nur 288 Werte haben, damit meine erstellte 
Grafik immer die richtige Breite hat. Wenn da Werte von 24h+x mit bei 
sind, ist mir das erstmal relativ egal.
Wie gesagt, ich könnte die Schleife auch umdrehen und hätte dann das 
gewünschte Ergebnis. Aber irgendwie will ich immer noch EINE sql-Abfrage 
haben, mit der ich das anders hinbekommen kann. ;)

von Frank (Gast)


Lesenswert?

Versuch es mal hiermit:

(SELECT id, adc1 FROM `testtabelle` order by id desc limit 288)
UNION
(SELECT id, adc1 FROM `testtabelle` WHERE FALSE)
ORDER BY id ASC

von Markus J. (mjay)


Lesenswert?

@Frank: Das war es! ;)
Auf die Idee bin ich nicht gekommen. Danke Dir!

von Frank (Gast)


Lesenswert?

Moment noch, ich hab ein wenig zu kompliziert gedacht...

Hiermit sollte es einfacher und auch ein wenig schneller funktionieren:

(SELECT * FROM `_categories` order by `page_id` desc limit 20)
ORDER BY page_id ASC

von Markus J. (mjay)


Lesenswert?

Das war eigentlich auch einer meiner ersten Gedanken. Ich frage mich nur 
gerade, warum das nicht geklappt hatte. Da hatte ich wohl irgendwo einen 
Fehler drin und die Fehlermeldung nicht richtig gedeutet...
Muss ich nachher mal ausprobieren.

von Markus J. (mjay)


Lesenswert?

Funktioniert einwandfrei. Allerdings hatte ich mich auch heute 2x 
vertippt, bis das Ergebnis kam. Das war wohl auch gestern der Fehler...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.