while() rückwärts
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
ablegen
anzahl
array
ausgeben
auslese
begrenzung
code
dank
datum
einfaches code
format
graph
limit
minute
ordern
reihenfolge
standard
treffer
url
-
Hey Leute,
folgendes Problem:
Ich lasse meinen Raspberry Pi per Bash Script jede Minute seine aktuelle Temperatur in eine MySQL Datenbank schreiben,
So weit so gut, das funktioniert alles einwandfrei.
Ich möchte jetzt die letzten 30 Minuten in einem Google Graph anzeigen lassen, was auch kein großes Hindernis darstellt.
Das Problem das ich allerdings derzeit habe ist, das der Graph falsch herum verläuft, sprich von Jetzt -> Damals und nicht Damals ->.
Meine Query lautet wie folgt:
$query = mysql_query("SELECT * FROM raspberry_data ORDER BY id DESC LIMIT 0,30");
Hiermit werden mir die letzten 30 Datensätze angezeigt, was auch völlig gewollt ist.
Diese lassen sich jetzt aber eben nur in dieser Reihenfolge ausgeben:
['Uhrzeit', 'Temperatur'], ['17:36:58', 50.8], ['17:37:01', 50.8], ['17:38:06', 50.8], ['17:41:56', 51.4], ['17:42:01', 51.4],
Um das ganze im Graph aber richtig anzuzeigen, ist es nötig das ganze herumzudrehen.
Wie kann ich das elegant lösen?
Gruß
PS: Der Titel spiegelt meine erste Idee wieder, ist aber nach Auskunft nicht möglich :D
Beitrag zuletzt geändert: 12.10.2013 18:42:57 von ra1n -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Afaik kannst du MySQL auch "rückwärts" abfragen. ;)
http://www.supernature-forum.de/programmierung-and-webdesign/22013-php-mysql-datenbank-rueckwaerts-auslesen.html -
1. Die Abfrage in ein Array ablegen
2. Array umkehren mit array_reverse()
3. Daten ausgeben
// -------------------------------------- $query = mysql_query("SELECT * FROM raspberry_data ORDER BY id DESC LIMIT 0,30"); // ----- Abfrage in ein Array ablegen ----- $data = array(); while($row = mysql_fetch_assoc($query)) { $data[] = $row; } // ----- Array umkehren ----- $reversedata = array_reverse($data); // ----- Daten ausgeben ----- foreach($reversedata as $item) { print "<br /> ".$item['zeit']." --- ".$item['temp']." \n"; } // --------------------------------------
aber das ist eigentlich viiel zu kompliziert ....
bei Abfrage einfach
machen (aufsteigend)ORDER BY id ASC
oder
bei Abfrage einfach
anstatt nach id sortiertORDER BY zeit ASC
halt die "richtige" Sortierung (ASC = aufsteigend und DESC = absteigend) nehmen
Bei der MySQL Abfrage "Sortierung nach Datum" kommt es auch drauf an,
in welchem Format du die Zeit in der DB hast., als Unix-TIMESTAMP
oder als DATETIME im US-Format oder im deutschen Format ...
-
Grundsätzlich sollte immer, sofern möglich, das SQL-Statement so angepasst werden, dass der Output schon in geeigneter Reihenfolge etc. daherkommt, somit einfach DESC mit ASC ersetzten und nicht mehr im PHP umkehren. Denn Datenbanksysteme egal ob MySQL, MSSQL oder Oracle sind (meistens) performanter als mit PHP zu mischen, da diese sowieso die Daten auslesen müssen, ob sie dies nun in anderer Reihenfolge machen spielt kaum noch eine Rolle.
-
Danke für eure Vorschläge, habe das ganze jetzt entsprechend umgesetzt, hier die jetzt von mir verwendete Lösung:
$anzahl = mysql_num_rows(mysql_query("SELECT * FROM raspberry_data")); $von = $anzahl - 30; $query = mysql_query("SELECT * FROM raspberry_data ORDER BY id ASC LIMIT $von,$anzahl");
-
Ein einfaches
$query = mysql_query("SELECT * FROM raspberry_data ORDER BY id LIMIT 30");
hätte auch gereicht.
ASC ist Standard also kann es weggelassen werden.
Und eine Begrenzung, wenn man die letzten oder die ersten 30 Treffer braucht, ist auch unnötig.
Von daher reicht die Anzahl der Treffer.
Aber man es natürlich auch komplizierter basteln.
Beitrag zuletzt geändert: 13.10.2013 21:09:40 von kgreen -
kgreen schrieb:
Nein, hätte es nicht, dann hast du mein Problem nicht verstanden wenn du mir das als Lösung vorschlägst.
Ein einfaches
$query = mysql_query("SELECT * FROM raspberry_data ORDER BY id LIMIT 30");
hätte auch gereicht.
ASC ist Standard also kann es weggelassen werden.
Und eine Begrenzung, wenn man die letzten oder die ersten 30 Treffer braucht, ist auch unnötig.
Von daher reicht die Anzahl der Treffer.
Aber man es natürlich auch komplizierter basteln.
Dieses gibt mir nämlich die ersten 30 Datensätze aus, die ich nach der id geordnet erhalte, sprich die ältesten 30 Stück.
Ich benötige jedoch die neusten 30, nur nicht in der Reihenfolge wie ich sie mit DESC erhalte, sondern umgekehrt, deswegen ASC und das selbst errechnete LIMIT. -
Ich hab dazu letztens schonmal überlegt, jetzt ist mir grade spontan die Idee einer Subquery gekommen. Versuch mal:
$query = mysql_query("SELECT * FROM (SELECT * FROM raspberry_data ORDER BY id DESC LIMIT 0,30) as Rd ORDER BY id ASC");
Beitrag zuletzt geändert: 14.10.2013 19:34:21 von copynpaste -
Einwandfrei, exakt das was ich gesucht habe in einer Zeile.
Ich danke dir! -
ra1n schrieb:
Einwandfrei, exakt das was ich gesucht habe in einer Zeile.
Ich danke dir!
Dazu muss ich noch sagen, dass kurze Scripte nicht gleich besser sind, bei dir klingt es nämlich grad so.
Ein Script ist erst dann gut, wenn es wartbar, (wiederverwendbar,) übersichtlich und vorallem fehlerunanfällig ist. So sollte man auch nicht immer die einfachste, sondern eine Richtige Lösung nehmen ;)
Ich hoffe das klingt jetzt nicht nach blabla -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage