Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.php > #4105

Re: Zeitabhängige Gruppierung von Datensätzen

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.

Show all headers | View raw


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 | NextNext in thread | Find similar | Unroll thread


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