sql abfrage

nick25

Well-known member
ID: 205997
L
30 Mai 2009
515
23
ich habe ein sql tabelle mit dem namen tanken. ich lese alle 5 min den sprit preis per cron von einer externen seite aus. der tabelleneintrag sieht so aus:


id|zeit|preis
1|1401446519|1,55
2|1401446819|1,55
...|...|...
96|1401475319|1,56
...|...|...
156|1405475319|1,55





nun mein problem: da der spritpreis sich ja nich alle 5 min ändert, möchte ich nicht eine lange liste mit zeit und preis haben sondern nur die zeiten(mit preis) wo sich die preise ändern. ich habe es mit dem select probiert:

SELECT * FROM tanken GROUP BY preis desc

nur dann zegt er nicht alle neuen änderungen wie z.b wenn der preis von 1,55 auf 1,56 steigt und 2h später wieder auf 1,55 zurück geht. dann zeigt er die änderung nicht an, weil der preis von 1,55 schon vorhanden ist.

wie muss die select abfrage heißen damit der alle änderungen anzeigt. oder ist es besser die gleichen einträge gleich aus der DB zu löschen? nur die delete abfrage wüßte ich nicht.
 
Zuletzt bearbeitet:
Die Änderungen zu erfassen reicht schon: Alle X Minuten die Preise einsammeln und mit dem jeweils letzten Wert vergleichen. Wenn sich der aktuelle Preis vom zuletzt gespeicherten unterscheidet muß ein neur Datensatz angelegt werden. Dabei muß sichergestellt sein daß X kleiner ist als der kleinstmögliche Zeitraum zwischen zwei Änderungen.

Ebenso läßt sich auch der vorhandene Datenbestand verkleinern: Tabelle von vom ersten bis zum letzten Eintrag abgrasen, wenn P[k] und P[k-1] gleich sind kann der Datensatz k gelöscht werden.
 
ein INNER JOJN sollte Deine Aufgabenstellung lösen können:

Code:
SELECT A.*
FROM tanken A 
INNER JOIN tanken B
ON A.ID = B.ID+1
WHERE A.PREIS ^= B.PREIS
 
Die Änderungen zu erfassen reicht schon: Alle X Minuten die Preise einsammeln und mit dem jeweils letzten Wert vergleichen. Wenn sich der aktuelle Preis vom zuletzt gespeicherten unterscheidet muß ein neur Datensatz angelegt werden. Dabei muß sichergestellt sein daß X kleiner ist als der kleinstmögliche Zeitraum zwischen zwei Änderungen.

Ebenso läßt sich auch der vorhandene Datenbestand verkleinern: Tabelle von vom ersten bis zum letzten Eintrag abgrasen, wenn P[k] und P[k-1] gleich sind kann der Datensatz k gelöscht werden.

wie stelle ich das mit 1-2 zeilen quelltext an?

ein INNER JOJN sollte Deine Aufgabenstellung lösen können:

Code:
SELECT A.*
FROM tanken A 
INNER JOIN tanken B
ON A.ID = B.ID+1
WHERE A.PREIS ^= B.PREIS

leider funktioniert die select abfrage nicht.
 
Statt
PHP:
WHERE A.PREIS ^= B.PREIS
müsste es wohl
PHP:
WHERE A.PREIS <> B.PREIS
heissen.
Ansonsten gefällt mir die Lösung per Inner-Join hier schon :)
 
super klasse. danke euch beiden. jetzt funktioniert es. ich wäre auf diese select abfrage nie gekommen.

eine frage hätte ich noch. wie würde ich die idee von apolle umsetzen? logisch klingt es aber verstehen tue ich es nicht. :oops:
 
Schritt 1: Daten abfragen
Schritt 2: Letzten Datensatz aus der DB auslesen
Schritt 3: prüfen ob Wert_Alt != Wert_neu
Schritt 4: Wenn ja shreibe neuen Wert in DB
 
es hat geklappt. vielen dank an alle.

edit: schließen kann man den thread nicht mehr selbst.
 
Stell den Code einfach mit rein. Sonst buddelt (in gefühlten 100 php/mysql-Versionen...) noch jemand mit 'nem ähnlichen Problem einen halbvermoderten Thread wieder aus... :mrgreen: