MySQL abfrage über mehrere Tabellen

  • Hallo zusammen,

    ich bastel gerade an meinem AquariumPI und habe ein PHP/Mysql problem.
    Ich möchte den Status der Funksteckdosen abfragen, die Werte werden beim schalten in MySQL Tabellen geschrieben.
    Soweit so gut...
    Nun möchte ich den Status aller Funksteckdosen auf einer Webseite anzeigen.

    DB Name: aqua
    Tabellennamen: A1Licht_R1, A1Licht_R2, A1Licht_LED, A1Licht_Nacht
    Tabellenspalten: A1Licht_R1, A1Licht_R2, A1Licht_LED, A1Licht_Nacht (heißen genau so wie die tabellen)

    Inhalt der jeder tabelle:
    a1.jpg

    Nun möchte ich den aktuellen Status jeder Funksteckdose anzeigen lassen.

    Meine Bisherige abfrage lautet:

    Code
    $query = "SELECT A1Licht_R1, A1Licht_R2, A1Licht_LED,  A1Licht_Nacht  FROM A1Licht_R1, A1Licht_R2, A1Licht_LED,  A1Licht_Nacht";

    Funktioniert auch, dauert aber extrem lange.
    Nun will ich nur noch den aktuellsten Eintrag aus jeder Tabelle abfragen. dafür wollte ich den TimeStamp (Feld dattim) in jeder DB nutzen.

    Ih dachte ich könte dies mit

    SQL
    SELECT A1Licht_R1, A1Licht_R2, A1Licht_LED,  A1Licht_Nacht FROM A1Licht_R1, A1Licht_R2, A1Licht_LED,  A1Licht_Nacht where max(dattim)


    bewerkstelligen.
    Hier bekomme ich aber die Fehlermeldung:

    Code
    Fehler in der SQL-Abfrage (1111): Invalid use of group function

    Habt Ihr eine Lösung für mich?

    Ich will doch einfach nur die Aktuellsten Einträge sehen :(

    Vielen Dank im Voraus
    Markus

    Einmal editiert, zuletzt von cced (28. August 2014 um 18:14)

  • Sorry, damit kann ich nicht viel anfangen, und google anscheinend auch nicht.
    Bin blutiger MySQL Anfänger :)

    So hätte es aber funktioniere müssen:

    SQL
    SELECT * 
    FROM A1Licht_R1, A1Licht_R2, A1Licht_LED, A1Licht_Nacht
    ORDER BY dattim DESC
    LIMIT 1

    Allerdings erhalte ich jezt:

    Code
    Fehler in der SQL-Abfrage (1052): Column 'dattim' in order clause is ambiguous


    Ja, na klar ist Datum / Uhrzeit unterschiedlich :(

  • Vielen Dank!!!


    SQL
    SELECT * 
    FROM A1Licht_R1, A1Licht_R2, A1Licht_LED, A1Licht_Nacht
    ORDER BY A1Licht_R1.dattim, A1Licht_R2.dattim, A1Licht_LED.dattim, A1Licht_Nacht.dattim
    LIMIT 1


    Ergebniss:
    a2.jpg

    Mein gott 1 Tag für die Tonne... das nächste mal frage ich sofort hier nach..!!!!

    LG Markus

    Einmal editiert, zuletzt von cced (28. August 2014 um 18:50)

  • Hi,
    auch wenn Du bereits glücklich bist.


    Sorry, damit kann ich nicht viel anfangen, und google anscheinend auch nicht.
    Bin blutiger MySQL Anfänger :)
    ...

    zum Schliessen der Bildungslücke ;) ... -> hier <- klicken (ich wusste doch, da war was mit first/last ...).
    cheers,
    -ds-

  • Sowas passiert, wenn man die Grundlagen der Datenbank nicht berücksichtigt. Als erstes solltest Du Deine Tabellen normalisieren. Dass heisst, z.B. die Datenbanktabellen so zu gestalten, dass die Spaltenköpfe keine Daten enthalten. Bei Dir sind die Spaltenköpfe die verschiedenen Stellen. Was machst Du, wenn eine Stelle dazukommt? Etwa eine neue Tabelle? Die Tabellen Könnten (sollten) so aussehen:

    Tabelle Schaltstellen:

    id_Schaltstelle, Bezeichnung, Beschreibung (muss nicht)

    Tabelle Schaltstatus

    id_Schaltstatus, Bezeichnung, ...

    Tabelle Schaltvorgänge

    id_Vorgang, id_Schaltstelle, id_Schaltstatus, Zeit

    Jetzt kannst Du die Tabellen mit einer join (nicht Joint :lol:) abfragen.

    Um die letzten Einträge zu finden suchst Du die größte id der Tabelle Schaltvorgänge

    Wenn Du nun die Ergebnisser der Abfrage der Tabelle Schaltstellen in einer Schleife laufen lässt, hast Du mit folgenden Abfragen den letzten Eintrag:

    SQL
    SELECT MAX(id) AS letzter_eintrag FROM tabellenname ";
    
    
    SELECT id FROM tabelle ORDER BY id DESC LIMIT 1



    Da sind ja gleich ein paar Antworten dazu gekommen, seit ich geschrieben habe. Aber die Datenbank in der jetzigen Form ist sehr beschränkt in den Möglichkeiten.

  • So wie ich das im ersten Beitrag verstehe hast du mehrere Tabellen, was aber nicht so toll und performant ist. Oder wieso willst du wissen zu welcher Uhrzeit die Lampe zuletzt An/Aus war?
    Irgendwann wächst die Datenbank ins unermessliche. Teile das lieber auf, in eine Tabelle mit aktuellen Zustand für jede Lampe und eine andere Tabelle mit den Timestamps für jede Lampenschaltung. Nach 6 Monaten könntest du dann auch einfacher nur die Timestamp-Tabelle leeren ;)

    Auch solltest du lieber nur Zahlen in die Tabelle eintragen also 1 für An und 0 für Aus. In PHP Kannst du dann für den Zustand Text anzeigen lassen. Das wäre auch für dein dattim performanter wenn du da nur den Unixtimestamp hinterlegst, zumal du dann via PHP ziemlich bequem das Datumsformat usw selber festlegen kannst: http://php.net/manual/de/function.date.php

  • Danke für eure Anregungen und Unterstützung.
    Werde versuchen das umzusetzen.

    Es geht um folgendes, Ich habe 3 Aquarien,
    Aqua 1 hat 4 lampen (Röhre), 2 LED Leisten und eine Nach LED.
    Ich möchte auf der Sttus / Schaltseite Grafiken anzeigen lasse, welche Lampe(n) gerade an und welche aus ist.
    und das ganze für alle 3 Aquarien (verschieden viele Lampen).
    Soll sieht dann so aus:
    a3.jpg

    LG Markus

    Einmal editiert, zuletzt von cced (28. August 2014 um 19:32)

  • Also ich würde das so machen:

    Wenn eine Lampe geschaltet wird erst prüfen ob ein Eintrag für die jeweilige Lampe existiert.
    - Wenn nicht dann einen neuen Eintrag mit INSERT anlegen.
    - Wenn doch dann den vorhandenen Eintrag mit UPDATE aktualisieren.

  • [code=php]//einschalten
    $check = mysql_query("SELECT A1Licht_R1 FROM A1Licht_R1 WHERE A1Licht_R1 = 1");
    if ($check) {
    $update = mysql_query(" UPDATE A1Licht_R1 SET A1Licht_R1='1', dattim='time()' ");
    } else {
    $insert = mysql_query(" INSERT INTO A1Licht_R1 VALUES (NULL, time(), '1') ");
    }
    [/php]

    Irgendwie so - keine Gewähr :D

  • Danke, hoffe damit komme ich weiter,
    allerdings lasse ich per BashScript in die Datenbank scheiben.
    Der Schaltvorgang läuft per Basch, und dort lasse ich dann auch den DB Eintrag machen.
    BASH

    Code
    A1Licht_R1="AN"
    INSERT="insert into $db.$tab (A1Licht_R1) VALUES (\"$A1Licht_R1\");"
    echo $insert | mysql -h $server -P $port -u $user -p"$pass" $db


    und funktioniert...
    Mein Update sieht so aus

    Code
    A1Licht_R1="0"
    UPDATE="update $db.$tab (A1Licht_R1) VALUES (\"$A1Licht_R1\");"
    echo $UPDATE | mysql -h $server -P $port -u $user -p"$pass" $db


    ...und funktioniert nicht :(

    Code
    ERROR 1064 (42000) at line 1: 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 '-e aqua.A1Licht_R1 (A1Licht_R1) VALUES ("0")' at line 1

  • Hi,
    wenn es nur drum geht, den Status zu merken ... meint Ihr nicht, dass da eine Datenbank vielleicht ein klein wenig oversized ist ;) ...
    Eine Datei pro Lampe mit Inhalt 0 oder 1 ... und gut ist ...

    cu,
    -ds-

    Ja, kann man machen, da das aber eine Größere Geschichte werden soll (Komplette verwaltung der Aquarien)
    Angefangen beim Automatischen / Manuellen Schlten der Lampen, über Wasserwerte durch Sensoren gemessen und den Automatischen Wasserwechsel bei Bedarf, sowie die Druchflußmengen der Filter....
    Denke ich, ist es besser gleich alles in eine DB zu schreiben.

  • Hi,


    ...
    ... da das aber eine Größere Geschichte werden soll (Komplette verwaltung der Aquarien)
    ...


    dann allerdings würde ich, wie hier auch schon mal angeregt, erst einmal ein Redesign der Datenbank und Tabellen machen ...
    Ich fürchte, Du würdest Dich sonst bald aus lauter Verzweiflung hinter den nächsten Zug schmeissen ;) ...

    cu,
    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!