Differenz zwischen Spalten berechnen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ausgabe
basteln
berechnen
code
date
datenbank
differenz
ergebnis
hobby
log
not
null
ordern
punkt
schleife
speichern
tabelle
url
versprochene code
vorherigen eintrags
-
So, weil es so schön war mal noch eine Frage. Habe nun schon ne Weile Dr.Google befragt, werde aber nicht fündig. Dort finde ich nur wie man Zeitabstände von timestamps berechnet.
Ich möchte die Differenz zwischen 2 Spaltenwerten berechnen. Ich speichere über einen Cronjob „Userwerte“ in bestimmten Zeitintervallen in einer DB-Tabelle ab. Dabei wird auch ein Punktestand gespeichert, um den geht es mir jetzt.
Das Select:
$dbabfrage = "SELECT * FROM pointlogger_koeln WHERE id='$id_sort' ORDER BY date ASC";
Die Schleife in der die Daten ausgegeben werden:
while ($ausgabe = mysql_fetch_array ($result)){ $count++; echo "<tr> <td>$ausgabe[id]</td> <td>$ausgabe[hs]</td> <td><b>$ausgabe[punkte]</b></td> <td>$ausgabe[date]</td> </tr>"; if ($count == 2) { echo "<tr>"; $count = 0; } }
Es werden alle Einträge einer ID angezeigt und nach timestamp sortiert, ich möchte nun die Differenz des Wertes
zum vorgehenden Eintrag ermitteln und ausgeben.<td><b>$ausgabe[punkte]</b></td>
Hier mal ein Screen von der Ausgabe, vieleicht versteht man es damit leichter. Die dicken Werte sind die um die es geht.
http://prntscr.com/lwq0k
LG Marco -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Speicher den Wert des vorherigen Eintrags in einer Hilfsvariable und verrechne diesen in der Schleife:
$last_points = null; while ($ausgabe = mysql_fetch_array ($result)){ if ($last_poins == null) { $last_points = $ausgabe[punkte]; } $count++; $point_diff = $last_points - $ausgabe[punkte]; echo "<tr> <td>$ausgabe[id]</td> <td>$ausgabe[hs]</td> <td><b>$point_diff</b></td> <td>$ausgabe[date]</td> </tr>"; if ($count == 2) { echo "<tr>"; $count = 0; } $last_points = $ausgabe[punkte]; }
-
gib mir die spaltennamen deiner datenbank, dann kann ich dir einen querystring für SQL basteln, der dir die differenz bereits fertig errechnet ausspuckt...
aber wird wahrshcienlich erst morgen werden, muss dann noch weg... für längere zeit...
Beitrag zuletzt geändert: 11.12.2012 17:22:03 von sebulon -
ploco schrieb:
Speicher den Wert des vorherigen Eintrags in einer Hilfsvariable und verrechne diesen in der Schleife:
$last_points = null; while ($ausgabe = mysql_fetch_array ($result)){ if ($last_poins == null) { $last_points = $ausgabe[punkte]; } $count++; $point_diff = $last_points - $ausgabe[punkte]; echo "<tr> <td>$ausgabe[id]</td> <td>$ausgabe[hs]</td> <td><b>$point_diff</b></td> <td>$ausgabe[date]</td> </tr>"; if ($count == 2) { echo "<tr>"; $count = 0; } $last_points = $ausgabe[punkte]; }
Das habe ich mal getestet, sollte auch das ergeben was ich mir vorstelle, ich bekomme aber leider immer 0 als Differenz angezeigt auch wenn ein Differenz vorhanden ist. Ich schau mir das aber noch genauer an, sollte doch irgendwie auch so machbar sein.
sebulon schrieb:
gib mir die spaltennamen deiner datenbank, dann kann ich dir einen querystring für SQL basteln, der dir die differenz bereits fertig errechnet ausspuckt...
aber wird wahrshcienlich erst morgen werden, muss dann noch weg... für längere zeit...
Das würde mich schon interesieren wie das geht, wenn der Wert schon fertig aus der DB kommt wäre das natürlcih viel einfacher und wohl auch schneller.
hier mal die Tabelle
CREATE TABLE `pennereck_de`.`pointlogger_koeln_01` ( `log` int( 12 ) NOT NULL AUTO_INCREMENT , `id` int( 30 ) DEFAULT NULL , `punkte` int( 30 ) DEFAULT NULL , `hs` int( 30 ) DEFAULT NULL , `gangid` int( 20 ) DEFAULT NULL , `rp` int( 12 ) DEFAULT NULL , `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP , PRIMARY KEY ( `log` ) ) ENGINE = MYISAM DEFAULT CHARSET = latin1;
LG -
Hi,
hier der versprochene Code:
SELECT ABS(`punkte` - (SELECT `punkte` from `pointlogger_koeln_01` where `id` = '$ID_1')) as ergebnis FROM `pointlogger_koeln_01` WHERE `id` = '$ID_2'; ; ;
//welcher depp kam auf die IDee, ein SQL snippet auf 1,5 zeilen höhe zu beschränken?! sieht echt scheisse aus... die semikolons unten sind nur da, damit man das auch lesen kann... unnötig, geben aber auch keinen syntaktischen Fehler...
Reihenfolge der IDs ist egal, weil ich mit der Differenz den absoluten wert ermittle...
Beitrag zuletzt geändert: 12.12.2012 9:33:49 von sebulon -
Hi,
sorry das ich den Fred hier derzeit etwas einschlafen lasse, habe im Moment zu viel Arbeit und die Weihnachtszeit tut Ihr übriges dazu. Da fehlt leider etwas die Zeit für´s Hobby.
Ich habe aber immer mal zwischendurch etwas „rumprobiert“ hier mal ein Update was ich bisher draus gemacht habe.
Mit dem Code von ploco hab ich das Ganze erst mal zum Laufen bekommen, sogar so wie ich es wollte.
$last_points = "0"; while ($ausgabe = mysql_fetch_array ($result)){ if ($last_poins == "0") { $last_points = $ausgabe[punkte]; } $point_diff = $last_points - $ausgabe[punkte] ; if ($point_diff == "500") { $wb_ende_ermittelt = "<b>WB geloggt</b>"; } else { $wb_ende_ermittelt = ""; }
Bei dem anderen Codestück komme ich nicht wirklich klar, da es auf die Art aber anscheinend schneller gehen würde versuche ich noch hinter den Code zu steigen.
sebulon schrieb:
Hi,
hier der versprochene Code:
SELECT ABS(`punkte` - (SELECT `punkte` from `pointlogger_koeln_01` where `id` = '$ID_1')) as ergebnis FROM `pointlogger_koeln_01` WHERE `id` = '$ID_2'; ; ;
Wenn ich das richtig verstehe, dann wird hier von den aktuellen Punkten, die vorhergehende Punktzahl abgezogen, also immer die vorhergehende ID abgezogen. Was ich nicht verstehe ist, woher kommt
im$ID_1
? Ich definierewhere `id` = '$ID_1'
ja nirgends vorher. Das gleiche dann beim nächsten WHERE$ID_1
WHERE `id` = '$ID_2'; mit $ID_2'.
Ich bekomme auch keine Ausgabe damit hin, ich habe den Code immer nach meinem ersten SELECT eingefügt.
$dbabfrage = "SELECT * FROM pointlogger_{$city_auswahl} WHERE id='$id_sort' ORDER BY date DESC"; $dbabfrage_points = "SELECT ABS(`punkte` - (SELECT `punkte` from `pointlogger_koeln_01` where `id` = '$ID_1')) as ergebnis FROM `pointlogger_koeln_01` WHERE `id` = '$ID_2'"; ; ;
So das ist mal der aktuelle Stand zum Thema, sorry nochmal das ich derzeit nicht so aktiv am Thema geblieben bin, nach Weihnachten ist das Leben dann wieder etwas ruhiger und das Hobby bekommt wieder mehr Zeit ab.
Ich danke Euch wie immer für die Tipps und die Hilfe, immer wieder super hier.
Nen fröhliches Weihnachtsfest und ein paar besinnliche Tage wünsche ich Euch natürlich auch.
LG Marco
-
$ID1 und $ID2 sind einfach nur platzhalter für Variablen, die du über PHP übergibst, irgendwie musst du dem ja sagen, die differenz zwischen welchen Einträgen er berechnen soll... und da du oben dich dieser Schreibweise bedient hast, dachte ich mir, das wäre klar...
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage