Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.php > #4105
| From | Sebastian Suchanek <sebastian.suchanek@gmx.de> |
|---|---|
| Newsgroups | de.comp.datenbanken.mysql, de.comp.lang.php |
| Subject | Re: Zeitabhängige Gruppierung von Datensätzen |
| Date | 2017-05-15 22:53 +0200 |
| Message-ID | <ofd4fr$kk1$1@msgid.suchanek.de> (permalink) |
| References | <odg74b$v3g$1@msgid.suchanek.de> <odkpof$kr0$1@dont-email.me> |
Cross-posted to 2 groups.
Am 24.04.2017 um 14:09 schrieb Axel Schwenke: > On 22.04.2017 20:24, Sebastian Suchanek wrote: Ich pack's mal in diesen Thread, damit Interessierte den Hintergrund kennen. >> Für ein elektronisches Fahrtenbuch[1] habe ich eine Tabelle, die unter >> anderem die Felder "start_zeit", "start_km", "ende_zeit" und "ende_km" >> enthält, wo bei in den beiden "km"-Feldern die absoluten Kilometerstände >> des Autos bei Anfang und Ende der Fahrt gespeichert werden. > >> Was ich nun gerne optional hätte, ist folgendes Ergebnis (hier am >> Beispiel Fahrten, die nicht länger als 30min auseinander liegen, >> zusammenfassen): > >> Gibt's einen Weg, das innerhalb von MySQL zu lösen? > > Klar. > [...] > Wir bauen uns als erstes eine synthetische Spalte tour_id, die Touren > zusammenfaßt, die nicht weiter als 30 Minuten auseinander liegen. Dazu > brauchen wir zwei User-Variablen für die id und die Anfangszeit: > > MariaDB [test]> set @tour_id=0; > [...] > MariaDB [test]> select @ts:=min(t2) from fahrten; > [...] > Jetzt können wir dieses Ergebnis in einer derived table Subquery benutzen: > > MariaDB [test]> select min(start) as start, max(ende) as ende, sum(weg) from > (select @tour_id:=if(@ts + interval 30 minute > t1, @tour_id, @tour_id+1) as > tour_id, t1 as start, @ts:=t2 as ende, s2-s1 as weg from fahrten order by > t1) as temp1 group by tour_id; > [...] Inzwischen bin ich endlich mal dazu gekommen, das o.g. tatsächlich zu implementieren - bzw., ich habe es versucht. Hier zunächst "meine" Query. Die Spaltennamen sind an meine eigene Tabelle angepasst und lasse mir das Ergebnis in eine temporäre Tabelle packen, da ich damit die für mich eigentlich interessanten statistischen Auswertungen leichter machen kann: ------------------------------------- 8< ------------------------------ SET @tour_id=0; SELECT @ts:=min(ende_zeit) FROM Fahrten; CREATE TEMPORARY TABLE IF NOT EXISTS tours AS (SELECT MIN(start) AS `start`, MAX(ende) AS `ende`, SUM(weg) AS `weg` FROM (SELECT @tour_id:=IF(@ts + INTERVAL 30 MINUTE > start_zeit, @tour_id, @tour_id+1) AS `tour_id`, start_zeit AS `start`, @ts:=ende_zeit AS `ende`, ende_km-start_km AS `weg` FROM Fahrten ORDER BY start_zeit) AS temp1 GROUP BY tour_id); SELECT * FROM tours; ------------------------------------- 8< ------------------------------ Wenn ich diese Statements z.B. unter PHPmyAdmin in die "SQL"-Eingabe einkippe, erhalte ich das gewünschte Ergebnis. Wenn ich sie stattdessen in meinem eigenen Skript mittels mysqli::query ausführen will, erhalte stattdessen aber eine Fehlermeldung: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT @ts:=min(ende_zeit) FROM Fahrten; CREATE TEMPORARY TABLE IF NOT EXISTS to' at line 1" Wahrscheinlich hängt's nur an einer Kleinigkeit, trotzdem stehe ich gerade auf dem Schlauch. Kann mir 'mal jemand von dort 'runterhelfen? ;-) Was ich einigermaßen sicher ausschließen kann: - Tippfehler. Ich habe mir den Query-String aus meinem eigenen Skript ausgeben lassen und per Copy&Paste sowohl in PHPmyAdmin als auch in dieses Posting kopiert. (Zur minimal besseren Lesbarkeit habe ich hier im Posting nur ein paar Zeilenumbrüche eingefügt.) - Fehlende Zugriffsrechte. Erstens hat der DB-Nutzer, mit dem das Skript läuft, für die fragliche Datenbank "ALL PRIVILEGES"; zweitens tritt der Fehler auch dann auf, wenn ich das Skript testweise mit dem DB-root-Nutzer laufen lasse; und drittens würde ich da eine andere Fehlermeldung erwarten. Wie gesagt: wo liegt der Fehler? Da ich das Problem eher bei PHP (BTW: v5.6.30 "out of the box" auf Debian Jessie) vermute, mache ich mal ein XP nach de.comp.lang.php. Vorläufig ohne f'up, bitte beim Antworten entsprechend setzen. Tschüs, Sebastian
Back to de.comp.lang.php | Previous | Next — Next in thread | Find similar | Unroll thread
Re: Zeitabhängige Gruppierung von Datensätzen Sebastian Suchanek <sebastian.suchanek@gmx.de> - 2017-05-15 22:53 +0200
Re: Zeitabhängige Gruppierung von Datensätzen Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2017-05-15 21:03 +0000
Re: Zeitabhängige Gruppierung von Datensätzen Axel Schwenke <axel.schwenke@gmx.de> - 2017-05-16 15:27 +0200
Re: Zeitabhängige Gruppierung von Datensätzen Sebastian Suchanek <sebastian.suchanek@gmx.de> - 2017-05-18 22:03 +0200
csiph-web