Ankündigung

Einklappen
Keine Ankündigung bisher.

Abfrage Ergebnis in eine Json Tabelle speichern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Abfrage Ergebnis in eine Json Tabelle speichern

    Hallo in die Runde,

    ich habe folgende MySQL Abfrage
    Code:
    Select  avg(Value) as Mittelwert, Date_Format(Time,'%m') as Monat, Date_Format(Time, '%Y') as Jahr
    From Item1
    Group By Monat, Jahr
    Dies liefert mir folgendes Ergebnis:
    Mittelwert Monat Jahr
    2,541 1 2018
    2,991 1 2019
    4,157 2 2018
    5,174 2 2019
    4,78 3 2018
    7,485 3 2019
    usw.

    Jetzt benötige ich die Daten aber in einer Json Tabelle in folgender Struktur
    Monat 2018 2019
    1 2,541 2,991
    2 4,157 5,174
    3 4,78 7,485
    Ich habe es mit folgenden Code probiert allerdings sind da einige Fehler enthalten.
    PHP-Code:
    <?php
    $rows 
    = array();
    $table = array();
    $table ['cols'] = array(
            array(
    'Monat' => 'Monat''type' => 'string'),
            array(
    'Jahr' => 'Jahr''type' => 'string'),
            array(
    'Mittelwert' => 'Mittelwert''type' => 'number')
    );
    error_reporting('E_ALL');
    echo 
    "TEST";

    $pdo = new PDO('mysql:host=localhost;dbname=openhab''web''wha30-06-2011g.');
    $sql "Select avg(Value) as Mittelwert, Date_Format(Time,'%m') as Monat, Date_Format(Time, '%Y') as Jahr From Item1 Group By Monat, Jahr";

    $rows = array();

    foreach (
    $pdo->query($sql) as $row) {
            
    $temp = array();
            
    $temp[] = array('v'=> (string) $row['Monat']);
            
    $temp[] = array('v'=> (string) $row['Jahr']);
            
    $temp[] = array('v'=> (float) $row['Mittelwert']);
            
    $rows[] = array('c'=> $temp);
            }
    $table['rows'] = $rows;
    $jsonTable json_encode($table);
    ?>
    Kann mir hier bitte eine Weiterhelfen?

    Hintergrund:
    Ich möchte gerne meine gemessene Temperaturen in OpenHab mit Hilfe von Google Charts anzeigen lassen und dies Verlangt die Daten halt in diesem Format.

    Vielen Dank schon mal für die Hilfe

    Viele Grüße
    Torsten

  • #2
    Zitat von 26toto26 Beitrag anzeigen
    Hallo in die Runde,

    ich habe folgende MySQL Abfrage
    Code:
    Select avg(Value) as Mittelwert, Date_Format(Time,'%m') as Monat, Date_Format(Time, '%Y') as Jahr
    From Item1
    Group By Monat, Jahr
    Dies liefert mir folgendes Ergebnis:
    Mittelwert Monat Jahr
    2,541 1 2018
    2,991 1 2019
    4,157 2 2018
    5,174 2 2019
    4,78 3 2018
    7,485 3 2019
    usw.

    Jetzt benötige ich die Daten aber in einer Json Tabelle in folgender Struktur
    Monat 2018 2019
    1 2,541 2,991
    2 4,157 5,174
    3 4,78 7,485
    Ich habe es mit folgenden Code probiert allerdings sind da einige Fehler enthalten.
    PHP-Code:
    <?php
    $rows 
    = array();
    $table = array();
    $table ['cols'] = array(
    array(
    'Monat' => 'Monat''type' => 'string'),
    array(
    'Jahr' => 'Jahr''type' => 'string'),
    array(
    'Mittelwert' => 'Mittelwert''type' => 'number')
    );
    error_reporting('E_ALL');
    echo 
    "TEST";

    $pdo = new PDO('mysql:host=localhost;dbname=openhab''web''wha30-06-2011g.');
    $sql "Select avg(Value) as Mittelwert, Date_Format(Time,'%m') as Monat, Date_Format(Time, '%Y') as Jahr From Item1 Group By Monat, Jahr";

    $rows = array();

    foreach (
    $pdo->query($sql) as $row) {
    $temp = array();
    $temp[] = array('v'=> (string) $row['Monat']);
    $temp[] = array('v'=> (string) $row['Jahr']);
    $temp[] = array('v'=> (float) $row['Mittelwert']);
    $rows[] = array('c'=> $temp);
    }
    $table['rows'] = $rows;
    $jsonTable json_encode($table);
    ?>
    Kann mir hier bitte eine Weiterhelfen?

    Hintergrund:
    Ich möchte gerne meine gemessene Temperaturen in OpenHab mit Hilfe von Google Charts anzeigen lassen und dies Verlangt die Daten halt in diesem Format.

    Vielen Dank schon mal für die Hilfe

    Viele Grüße
    Torsten
    Ich weiß nicht, ob MySQL Kreuztabellenabfragen kann. Dann könntest du die DB-Abfrage als Kreuztabelle machen und dann direkt in ein JSON überführen.

    Kommentar


    • #3
      Tipp vorab: Wenn du Code postest und möchtest das andere den testen oder verbessern, dann mach ihn einfach ausführbar, indem du die Daten per SQLIte mockst, Stichwort "SQLite in-memory", oder mit var_export oder json_encode/decode bereitstellst. Die Daten als HTML-Tabelle bereitzustellen erzeugt nur unnötigen Aufwand für die Helfer hier, weil das irgendwer abschreiben muss - es hat auch nicht jeder einen MySQL-Server laufen.

      PS: Dein Datenbankpasswort zu posten ist auch nicht so pralle, auch wenn du das ggf. grade nur lokal benutzt.
      [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

      Kommentar


      • #4
        Grundsätzlich ist das ja aber nur eine simple Transformation, du mappst deine Zeilen ja einfach auf ein Korrdinatensystem, in dem der Monat die Zeile und die Jahre die Spalten definieren

        https://3v4l.org/ENfge
        [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

        Kommentar


        • #5
          Hallo,

          sorry erst mal das ich mich längere Zeit nicht mehr gemeldet habe aber ich habe im Moment wenig Zeit und ich wollte versuchen mit dem Tipp eine Lösung zu finden und nicht gleich wieder nachfragen.

          Das $output sieht schon mal sehr gut aus:
          PHP-Code:
          $result $pdo->query($sql);

          if(
          $result === FALSE) {
              echo 
          mysql_errno($result) .": "mysql_error($result) ."/n";
              die(
          mysql_error());
          }

          foreach(
          $result as $row){
              
          $output[$row['Monat']][$row['Jahr']] = $row['Mittelwert'];

          geliefert bekomme ich dann folgendes:
          Code:
          Array ( [02] => Array ( [2018] => -0.010574432424202588 [2019] => 5.514136904761902 ) [03] => Array ( [2018] => 4.352471715421477 [2019] => 6.4246268656716286 )
          usw.

          Jetzt habe ich nur das Problem wie ich die Daten ausgegeben bekomme. Hier mal der Original Code von Google (https://google-developers.appspot.co...ry/columnchart)
          Code:
          <html>
            <head>
              <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
              <script type="text/javascript">
                google.charts.load('current', {'packages':['bar']});
                google.charts.setOnLoadCallback(drawChart);
          
                function drawChart() {
                  var data = google.visualization.arrayToDataTable([
                    ['Year', 'Sales', 'Expenses', 'Profit'],
                    ['2014', 1000, 400, 200],
                    ['2015', 1170, 460, 250],
                    ['2016', 660, 1120, 300],
                    ['2017', 1030, 540, 350]
                  ]);
          
                  var options = {
                    chart: {
                      title: 'Company Performance',
                      subtitle: 'Sales, Expenses, and Profit: 2014-2017',
                    }
                  };
          
                  var chart = new google.charts.Bar(document.getElementById('columnchart_material'));
          
                  chart.draw(data, google.charts.Bar.convertOptions(options));
                }
              </script>
            </head>
            <body>
              <div id="columnchart_material" style="width: 800px; height: 500px;"></div>
            </body>
          </html>
          Sorry aber der HTML zeigt nur alles in einer Zeile an (keine Ahnung warum)

          Ich habe jetzt die function drawChart(), wo die Daten ja hingehören wie folgt abgeändert:
          HTML-Code:
           function drawChart() {
                  var data = google.visualization.arrayToDataTable([
                   ['Monat','2018','2019'], //das sind die Spalten Überschriften
                   //hier müssten jetzt die Daten rein von $output
                  ]);
          Die Spalten Überschriften sind nun zwar "hart" im Code aber die müssten ja nur einmal im Jahr angepasst werden.

          Wie bekomme ich jetzt die Daten von $output richtig in die function?

          Danke und viele Grüße
          Torsten

          PS: Das Passwort war nur fürs "web" und ist natürlich nicht das richtige deswegen auch der Benutzer web. Aber Danke ffür den Hinweis, es kann ja mal wirklich passieren das man das richtige Passwort veröffentlicht.

          Kommentar

          Lädt...
          X