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

Neuling ersucht Hilfestellung bei Abfragen-Erstellung

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Solivaguz, 9 August 2012.

  1. Solivaguz

    Solivaguz Neuer Benutzer

    Guten Tag,
    dies ist das erste Mal, dass ich mich extra in einem Forum anmelde um Hilfe zu bekommen. :)
    Aber ich weiss einfach nicht weiter.

    Ich habe die Grundlagen von SQL-Statements gelernt, bin nun aber mit meinem Latein am Ende.

    Folgende Situation:
    Ich lese 1-wire Temperatur-Sensoren aus und habe für jeden Sensor eine Tabelle angelegt.

    Tabelle "Sensor 1"
    TAG | MONAT | JAHR | UHRZEIT | MESSWERT
    01 | 05 | 2012 | 14:33:53 | 17.55
    01 | 05 | 2012 | 14:34:53 | 17.25


    Tabelle "Sensor 2"
    TAG | MONAT | JAHR | UHRZEIT | MESSWERT
    01 | 05 | 2012 | 14:22:53 | 17.55
    01 | 05 | 2012 | 14:34:53 | 18.25

    und so weiter... ich hoffe, dass es klar wird.

    Jetzt zu meinem Problem:
    Ich versuche seit Tagen eine Abfrage zu erstellen, die mir alle Daten aller Sensoren in einer Art CSV ausgibt. Mit folgendem Format:

    ABFRAGE "ALLE MESWERTE"
    TAG | MONAT | JAHR | UHRZEIT | SENSOR 1 | SENSOR2
    01 | 05 | 2012 | 14:22:53 | ------ | 17.55
    01 | 05 | 2012 | 14:33:53 | 17.25 | -------
    01 | 05 | 2012 | 14:34:53 | 17.25 | 18.25

    Sodass alle Messwerte nach Datum sortiert in einer Tabelle sichtbar werden.
    Diese Daten würde ich dann in eine CSV exportieren.


    Ich habe mir schon sehr lange den Kopf darüber zerbrochen und mich mit JOIN uvm. beschäftigt, bekomme es aber einfach nicht hin..

    Kann mir bitte jemand eine Hilfestellung oder eine Lösung geben?
    Danke im Vorraus - Solivaguz
     
  2. ukulele

    ukulele Datenbank-Guru

    Normalerweise wäre das einfach, du nimmst eine Ausgangstabelle und "joinst" alle anderen Messwerte dazu.

    Dein Problem könnte aber darin bestehen, das nicht für alle Tage und Zeiten Messdaten für alle Sensoren vorliegen. Man muss also davon ausgehen, das man keine Basistabelle hat auf die man die Messdaten aus den anderen Tabellen legen kann und das auch in diesen anderen Tabellen nicht zu jeder Zeit alle Messwerte zu finden sind.

    Eigentlich gibt es dafür die Möglichkeit des Cross Joins, aber ich bin nicht sicher, wie sich der auf MySQL macht oder ob das nicht zuviel Performance kostet. Deshalb eine etwas umständlichere Lösung (könnte aber auch Probleme machen):
    Code:
    SELECT    DISTINCT
            Basistabelle.TAG,
            Basistabelle.MONAT,
            Basistabelle.JAHR,
            Basistabelle.UHRZEIT,
            t1.MESSWERT AS [Sensor 1],
            t2.MESSWERT AS [Sensor 2],
            t3.MESSWERT AS [Sensor 3],
            t4.MESSWERT AS [Sensor 4]
    FROM    (    SELECT    DISTINCT *
                FROM    (    SELECT    TAG,
                                    MONAT,
                                    JAHR,
                                    UHRZEIT
                            FROM    tabelle1
                            UNION ALL
                            SELECT    TAG,
                                    MONAT,
                                    JAHR,
                                    UHRZEIT
                            FROM    tabelle2
                            UNION ALL
                            SELECT    TAG,
                                    MONAT,
                                    JAHR,
                                    UHRZEIT
                            FROM    tabelle3
                            UNION ALL
                            SELECT    TAG,
                                    MONAT,
                                    JAHR,
                                    UHRZEIT
                            FROM    tabelle4
                        ) Basis
            ) Basistabelle
    LEFT JOIN tabelle1 t1
    ON        t1.TAG = Basistabelle.TAG
    AND        t1.MONAT = Basistabelle.MONAT
    AND        t1.JAHR = Basistabelle.JAHR
    AND        t1.UHRZEIT = Basistabelle.UHRZEIT
    LEFT JOIN tabelle1 t2
    ON        t2.TAG = Basistabelle.TAG
    AND        t2.MONAT = Basistabelle.MONAT
    AND        t2.JAHR = Basistabelle.JAHR
    AND        t2.UHRZEIT = Basistabelle.UHRZEIT
    LEFT JOIN tabelle1 t3
    ON        t3.TAG = Basistabelle.TAG
    AND        t3.MONAT = Basistabelle.MONAT
    AND        t3.JAHR = Basistabelle.JAHR
    AND        t3.UHRZEIT = Basistabelle.UHRZEIT
    LEFT JOIN tabelle1 t4
    ON        t4.TAG = Basistabelle.TAG
    AND        t4.MONAT = Basistabelle.MONAT
    AND        t4.JAHR = Basistabelle.JAHR
    AND        t4.UHRZEIT = Basistabelle.UHRZEIT
    Die Basistabelle beinhaltet alle möglichen Zeiten jeweils einmal. per Left Join wird dann der jeweilige Messwert angefügt, wenn vorhanden.
     
  3. Solivaguz

    Solivaguz Neuer Benutzer

    Das mit der Basistabelle hatte ich mir auch schon überlegt.
    Habe mir eine angelegt und wie du sagst mit JOINS herumexperimentiert... Habe es aber nicht hinbekommen.

    Das, was du da gepostet hast, sieht ganz nützlich und sinnvoll aus.

    Ich werde mir das morgen mal in Ruhe durchlesen und nachvollziehen.

    Ich melde mich dann..

    Schonmal ein großes DANKE!
     
  4. Solivaguz

    Solivaguz Neuer Benutzer

    Hallo,

    ich bin gerade am Testen.
    Code:
    FROM    (    SELECT    DISTINCT *
                FROM    (    SELECT    TAG,
                                    MONAT,
                                    JAHR,
                                    UHRZEIT
                            FROM    tabelle1
                            UNION ALL
                            SELECT    TAG,
                                    MONAT,
                                    JAHR,
                                    UHRZEIT
                            FROM    tabelle2
                            UNION ALL
                            SELECT    TAG,
                                    MONAT,
                                    JAHR,
                                    UHRZEIT
                            FROM    tabelle3
                            UNION ALL
                            SELECT    TAG,
                                    MONAT,
                                    JAHR,
                                    UHRZEIT
                            FROM    tabelle4
                        ) Basis
            ) Basistabelle
    
    Wofür steht das Basis? Sollte eigentlich auch Basistabelle heißen, oder?

    Mein SQL meckert über Zeile 7 ...
    Ich probiere mal weiter rum.

    Mein angepasster Code bis jetzt:
    Code:
    SELECT    DISTINCT
            Basistabelle.tag,
            Basistabelle.monat,
            Basistabelle.jahr,
            Basistabelle.zeit,
            10A374C6000800CA.messwert
            10932BC6000800DD.messwert
    FROM    (    SELECT    DISTINCT *
                FROM    (    SELECT    tag,
                                    monat,
                                    jahr,
                                    zeit
                            FROM    10A374C6000800CA
                            UNION ALL
                            SELECT    tag,
                                    monat,
                                    jahr,
                                    zeit
                            FROM    10932BC6000800DD
                        ) Basistabelle
            ) Basistabelle
    LEFT JOIN 10A374C6000800CA
    ON        10A374C6000800CA.tag = Basistabelle.tag
    AND        10A374C6000800CA.monat = Basistabelle.monat
    AND        10A374C6000800CA.jahr = Basistabelle.jahr
    AND        10A374C6000800CA.zeit = Basistabelle.zeit
    LEFT JOIN 10932BC6000800DD
    ON        10932BC6000800DD.tag = Basistabelle.tag
    AND        10932BC6000800DD.monat = Basistabelle.monat
    AND        10932BC6000800DD.jahr = Basistabelle.jahr
    AND        10932BC6000800DD.zeit = Basistabelle.zeit
     
     
    
     
  5. Solivaguz

    Solivaguz Neuer Benutzer

    NACHTRAG (sry für Doppelpost)

    Es scheint zu klappen!!!
    Ich danke dir vielmals!

    Falls ich noch Probleme habe, melde ich mich noch einmal.
    Vielen Dank!

    Fertige Abfrage:
    Code:
    SELECT  DISTINCT
            Basistabelle.tag,
            Basistabelle.monat,
            Basistabelle.jahr,
            Basistabelle.zeit,
            10A374C6000800CA.messung,
            10932BC6000800DD.messung
    FROM    (
            SELECT    DISTINCT *
                    FROM    (
                            SELECT          tag,
                                            monat,
                                            jahr,
                                            zeit
                            FROM    10A374C6000800CA
                            UNION ALL
                            SELECT          tag,
                                            monat,
                                            jahr,
                                            zeit
                            FROM    10932BC6000800DD
                            ) Basistabelle
            ) Basistabelle
    LEFT JOIN 10A374C6000800CA
    ON        10A374C6000800CA.tag = Basistabelle.tag
    AND        10A374C6000800CA.monat = Basistabelle.monat
    AND        10A374C6000800CA.jahr = Basistabelle.jahr
    AND        10A374C6000800CA.zeit = Basistabelle.zeit
    LEFT JOIN 10932BC6000800DD
    ON        10932BC6000800DD.tag = Basistabelle.tag
    AND        10932BC6000800DD.monat = Basistabelle.monat
    AND        10932BC6000800DD.jahr = Basistabelle.jahr
    AND        10932BC6000800DD.zeit = Basistabelle.zeit
    
     
    Walter gefällt das.
  6. ukulele

    ukulele Datenbank-Guru

    Das Basis ist ein Alias für die Unterabfrage in den Klammern. Ich wollte eigentlich nicht 2x den selben Alias verwenden, aber scheint ja auch zu gehen.
     
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