Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Fehlende Werte durch Gruppierung

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Hxrzxr, 10 März 2017.

  1. Hxrzxr

    Hxrzxr Neuer Benutzer

    Hallo Forum,

    ich habe folgende Tabelle:

    CREATE TABLE `tabelle` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `typ` int(1) NOT NULL,
    `pfadname` varchar(150) NOT NULL,
    `quota` varchar(6) NOT NULL,
    `datum` datetime NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `Index` (`typ`,`pfadname`,`quota`,`datum`)
    ) ENGINE=InnoDB AUTO_INCREMENT=391079 DEFAULT CHARSET=utf8;

    Beispieldaten
    INSERT INTO `tabelle` VALUES
    (390217,1,'USERNAME','0,6','2017-03-06 13:24:39'),
    (345847,1,'USERNAME','0,5','2017-03-01 11:57:50'),
    (345853,6,'USERNAME\\Eigene Dateien','0,0','2017-03-01 11:57:50'),
    (390223,6,'USERNAME\\Eigene Dateien','0,0','2017-03-06 13:24:39'),
    (345869,7,'USERNAME\\Eigene Dateien\\Downloads','0,0','2017-03-01 11:57:50'),
    (345870,7,'USERNAME\\Eigene Dateien\\Test','0,0','2017-03-06 13:24:39');

    Meine Abfrage
    SELECT
    typ, pfadname,
    SUM(IF(datum = '2017-03-06 13:24:39',1,0)) AS datum1,
    SUM(IF(datum = '2017-03-01 11:57:50',1,0)) AS datum2,
    IF(datum = '2017-03-06 13:24:39',quota,0) AS quota1,
    IF(datum = '2017-03-01 11:57:50',quota,0) as quota2
    FROM
    tabelle
    WHERE
    (datum = '2017-03-06 13:24:39' OR datum = '2017-03-01 11:57:50')
    AND (typ = 1 OR typ = 6 OR typ = 7)
    AND pfadname LIKE 'USERNAME%'
    GROUP BY pfadname
    ORDER BY pfadname

    Ziel
    Damit erhalte ich eine Übersicht je Pfadname und je Datum mit der Info, ob ein Pfad existierte.
    Zusätzlich benötige ich aber von der Abfrage noch die Werte der Spalte quota je Datum.

    Hier erhalte ich natürlich nur einen der beiden Werte durch meine Gruppierung am Ende. Ich benötige aber beide Quota-Werte damit ich einen davon später mit PHP anzeigen kann (den Wert vom aktuelleren Datum) und den zweiten Wert (vom älteren Datum) um damit rechnen zu können und die Änderung zum 1. Wert anzeigen kann.

    Vielen Dank.
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Das gezeigte Select ist syntaktisch falsch. Alle Spalten müssen entweder aggregiert oder gruppiert sein, dies ist nicht der Fall. Neues MySQL-Versionen und alle anderen Datenbanken erkennen dies als Fehler, nur bisherige MySQL-Versionen nicht.

    Was soll, ausgehend von Deiner Tabelle, denn genau ausgegeben werden? Zeig Dein 'Wunschresultat'.
     
  3. Hxrzxr

    Hxrzxr Neuer Benutzer

    Hallo akretschmer,

    dies hier wäre mein Wunschergebnis

    Typ | Pfadname | datum1 | datum2 | quota1 | quota2
    1 | USERNAME | 1 | 1 | 0,6 | 0,5
    6 | USERNAME\Eigene Dateien | 1 | 1 | 0,0 | 0,0
    7 | USERNAME\Eigene Dateien\Downloads | 0 | 1 | NULL | 0,0
    7 | USERNAME\Eigene Dateien\Test | 1 | 0 | 0,0 | NULL


    Aktuelle teste ich mit dieser Abfrage weiter
    SELECT * FROM quota.tabelle;
    SELECT
    typ, pfadname,
    SUM(IF(datum = '2017-03-06 13:24:39',1,0)) AS datum1,
    SUM(IF(datum = '2017-03-01 11:57:50',1,0)) AS datum2,
    group_concat(quota, '#'
    order by datum DESC) as quota
    FROM
    tabelle
    WHERE
    (datum = '2017-03-06 13:24:39' OR datum = '2017-03-01 11:57:50')
    AND (typ = 1 OR typ = 6 OR typ = 7)
    AND pfadname LIKE 'USERNAME%'
    GROUP BY pfadname
    ORDER BY pfadname

    Sieht so aus, als wenn es so klappt. Muss jetzt nur die Werte voneinander trennen in PHP.
    Aber deine Hinweise möchte ich natürlich auch beachten. Meine Serverversion ist 5.7.9 (Windows).
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden