www.mikrocontroller.net

Forum: PC-Programmierung mySQL - die letzten X Werte


Autor: Markus J. (mjay)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moinsen!

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

Mit
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:
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:
#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

Autor: Ginegt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus J. schrieb:
> Gibt es da eine Möglichkeit?

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

Select ... Limit 5000, 288

Autor: moepmoep (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wärs mit ASC anstatt DESC?

Oder verstehe ich deine Frage nicht?

Autor: moepmoep (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder:

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

Autor: Markus J. (mjay)
Datum:

Bewertung
0 lesenswert
nicht 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. ;)

Autor: moepmoep (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus J. (mjay)
Datum:

Bewertung
0 lesenswert
nicht 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. ;)

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus J. (mjay)
Datum:

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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus J. (mjay)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus J. (mjay)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.