Ankündigung

Einklappen
Keine Ankündigung bisher.

Tabelle ausgeben

Einklappen

Neue Werbung 2019

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

  • Tabelle ausgeben

    Hallo allerseits,

    ich hatte hier schon einen Threat aufgemacht, wie ich eine DB schneller machen kann, weil das Skript immer sehr lange lief.

    Hier habe ich gelernt, dass ich zumindest mal zwei Tabellen mittels JOIN zu einer Tabelle zusammen fassen kann.

    Zwar geht die Abfrage jetzt viel schneller, ich beisse mir aber die Zähne daran aus das Ergebnis der Abfrage auszugeben.

    Die Felder in der DB, die ich ausgeben will, sehen so aus:

    jahr|filialnr|filiale|summe1|summe2

    Die Tabelle, in der ich das ausgeben will sieht so aus:
    -----------|----- 2007------|------2008 -----|------2009----- |------2010-----|
    filialnr|filiale|summe1|summe2|summe1|summe2|summe 1|summe2|summe1|summe2

    Vor der Tabellen-Optimierung bin ich in zwei Schleifen alle Jahre alle Märkte durchgegangen, weil Filialen und Inventur-Ergebnisse in zwei verschiedenen Tabellen gespeichert sind.

    Jetzt habe ich ja durch den JOIN quasi alle Daten in einer DB-Tabelle, aber ich schaffe es nicht diese Daten in einer HTML-Tabelle auszugeben.

    Nochmal kurz die Aufgabenstellung:
    Es geht um die Auswertung der Inventuren von 4 Jahren von jeweils ca.100 Filialen. Dadurch, dass jedes Jahr neue Filialen dazukommen, sind nicht bei allen Jahren Inventurergebnisse von jeder Filiale gespeichert.
    Die DB-Tabelle hat also keine feste Struktur.

    Hat jemand eine Idee, wie ich mit nur einer Schleife, die alle Filialen ausliest auch die Jahre zu befüllen?

    Gruß
    HiddenX


  • #2
    Das ist eine Form des Gruppenbruch-Verfahrens. Du kannst dir die Arbeit erleichtern, wenn du die Daten vorher in ein geeigneteres Format überführst (d.h. aus deiner "flachen" eine "tiefe" Struktur erzeugst).

    Wie liegen die Daten denn vor, wenn sie frisch aus der DB kommen?


    Übrigens, es heisst "Thread" (Diskussionsfaden) nicht "Threat" (Bedrohung)
    Zitat von HiddenX Beitrag anzeigen
    ich hatte hier schon einen Threat aufgemacht
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Danke für die Nachhilfestunde in Englisch, du hast natürlich Recht!

      Ein Auszug aus der Datenbank könnte so aussehen:

      jahr--nr-filiale-summe1-summe2
      2007 01 xxx - 10.000 --4
      2007 02 yyy - 11.000 --1
      2007 03 zzz - 12.000 --3
      2008 01 xxx - 11.000 -- 1
      2008 02 yyy - 12.000 --3
      2009 01 xxx - 10.000 --2
      2009 02 yyy - 11.000 --3
      2010 03 zzz - 9.000 ---4
      leer - 04 uuu - leer ---- leer
      leer - 05 vvv - leer ---- leer

      Es gibt keine Struktur, wie ich vorhin schon sagte, also keinen festen Abstand zwischen den Jahren (dass man sagen könnte 4 Datensätze füllen immer eine Zeile der Tabelle, dann kommt die nächste Zeile).
      Ganz blöd ist, wie in den zwei letzten Datensätzen angedeutet, wenn durch den JOIN ein Großteil der Felder leer ist. Das betrifft die Filialen, die noch keine Inventur hatten, oder für die schlicht noch keine Daten eingelesen wurden.
      Trotzdem muss logischwerweise die Zeile immer komplett gefüllt werden, wenn keine Daten da sind halt mit einem Strich oder einer Null.

      Ich stehe völlig auf dem Schlauch!

      Kommentar


      • #4
        Zitat von HiddenX Beitrag anzeigen
        Es gibt keine Struktur, wie ich vorhin schon sagte, also keinen festen Abstand zwischen den Jahren (dass man sagen könnte 4 Datensätze füllen immer eine Zeile der Tabelle, dann kommt die nächste Zeile).
        Dann überführst du die ausgelesenen Daten am besten erst mal in ein Array, mit folgendem Aufbau: $daten[filiale][jahr] = ...

        Beim erzeugen deiner Ausgabe kannst du dieses Array dann in seiner ersten Ebene durchlaufen - dabei erzeugst du für jede Filiale eine Tabellenzeile.
        Dabei schaust du dann nach, ob es auf der zweiten Ebene für das jeweilige Jahr einen Eintrag gibt - wenn ja, gibst du die Daten aus, sonst halt nichts oder - oder sonstwas.

        Trotzdem muss logischwerweise die Zeile immer komplett gefüllt werden, wenn keine Daten da sind halt mit einem Strich oder einer Null.
        Also bitte - das bei der Ausgabe abzufragen und entsprechend zu reagieren sollte aber für jemanden, der so eine Aufgabe übernommen hat, nun wirklich kein Problem darstellen (dürfen).

        Kommentar


        • #5
          Zitat von ChrisB Beitrag anzeigen
          Dann überführst du die ausgelesenen Daten am besten erst mal in ein Array, mit folgendem Aufbau: $daten[filiale][jahr] = ...
          Das hört sich sehr gut an.
          Aber ist es wirklich einfacher das Array erst zu befüllen und dann wieder auszulesen, als die Tabelle mehrfach auszulesen?
          Weil an der Struktur würde sich ja nicht ändern, oder? Die Daten lägen jetzt halt nur im Array statt in der Tabelle, oder habe ich das missverstanden?
          Oder ist es eine Sache der Performance, weil im einen Fall die DB über's Netz ausgelesen wird, im anderen Fall das Array aus dem Speicher?

          Zitat von ChrisB Beitrag anzeigen
          Also bitte - das bei der Ausgabe abzufragen und entsprechend zu reagieren sollte aber für jemanden, der so eine Aufgabe übernommen hat, nun wirklich kein Problem darstellen (dürfen).
          Stimmt. Wäre es mein Job solche Datenbanken aufzubauen und solche Abfragen zu programmieren, wäre ich völlig fehl am Platz
          Ich mache das quasi "nebenher" und zum Großteil in meiner Freizeit, weil es mich selbst weiterbringt. Zum einen eben in der Programmierung und zum anderen weil ich damit eine Auswertung machen kann, die genauer ist als die, die ich "geliefert" bekomme.

          Kommentar


          • #6
            Zitat von HiddenX Beitrag anzeigen
            Das hört sich sehr gut an.
            Aber ist es wirklich einfacher das Array erst zu befüllen und dann wieder auszulesen, als die Tabelle mehrfach auszulesen?
            Weil an der Struktur würde sich ja nicht ändern, oder? Die Daten lägen jetzt halt nur im Array statt in der Tabelle, oder habe ich das missverstanden?
            Oder ist es eine Sache der Performance, weil im einen Fall die DB über's Netz ausgelesen wird, im anderen Fall das Array aus dem Speicher?
            Ja.

            Ja, die Daten liegen dann in einem Array

            Ja!

            Geschwindigkeit: RAM > Festplatte > Kabel (LAN)
            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

            Kommentar


            • #7
              Zitat von ChrisB Beitrag anzeigen
              Dann überführst du die ausgelesenen Daten am besten erst mal in ein Array, mit folgendem Aufbau: $daten[filiale][jahr] = ...
              Ok, ich denke soweit habe ich das verstanden.

              Jetzt habe ich natürlich nicht nur einen, sondern zwei Werte, die ich abspeichern muss.

              Ich dachte, ich speichere einfach beide Werte getrennt mit Semikolon und pfücke das nachher bei der Ausgabe wieder auseinander.

              Also:
              PHP-Code:
              $db_array[fil_nr][jahr] = $wert_diff.';'.$menge_diff
              Wäre der Ansatz OK, oder mache ich das wieder zu umständlich?

              Kommentar


              • #8
                ...oder mache ich das wieder zu umständlich?
                Ja. Wenn Du schon eine Datenbank verwendest, solltest Du die Werte auch separat abspeichern!

                Wolf29
                while (!asleep()) sheep++;

                Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

                Kommentar


                • #9
                  Also mehrere Arrays?

                  PHP-Code:
                  $wdiff[fil_nr][jahr] = $wert_diff.';  
                  $mdiff[fil_nr][jahr] = $menge_diff; 

                  Kommentar


                  • #10
                    Zitat von HiddenX Beitrag anzeigen
                    Also mehrere Arrays?

                    PHP-Code:
                    $wdiff[fil_nr][jahr] = $wert_diff.';  
                    $mdiff[fil_nr][jahr] = $menge_diff; 
                    Mit dem Code würdest du dir in der zweiten Zeile den in der ersten gemachten Eintrag wieder überschreiben ... wenn dir selbst das nicht klar ist, dann wird's wirklich Zeit, dass du erst mal Grundlagen lernst.

                    Jetzt habe ich natürlich nicht nur einen, sondern zwei Werte, die ich abspeichern muss.
                    Du weißt doch inzwischen, dass es Arrays gibt - also nutze sie, auch an solchen Stellen.
                    PHP-Code:
                    $data['Filiale4711'][2012] = array($wert1$wert2, ...); 

                    Kommentar


                    • #11
                      Zitat von ChrisB Beitrag anzeigen
                      Mit dem Code würdest du dir in der zweiten Zeile den in der ersten gemachten Eintrag wieder überschreiben ... wenn dir selbst das nicht klar ist, dann wird's wirklich Zeit, dass du erst mal Grundlagen lernst.
                      Warum so harsch? Wieso überschreibt $mdiff $wdiff?

                      Zitat von ChrisB Beitrag anzeigen
                      Du weißt doch inzwischen, dass es Arrays gibt - also nutze sie, auch an solchen Stellen.
                      PHP-Code:
                      $data['Filiale4711'][2012] = array($wert1$wert2, ...); 
                      Würde ich ja gern - das sieht sehr gut aus - ich weiss aber nicht wie ich ein solches Konstrukt auslese
                      Normale Arrays mit foreach($array as $wert) {...}
                      Aber das?

                      Kommentar


                      • #12
                        Zitat von HiddenX Beitrag anzeigen
                        Warum so harsch?
                        Wieso lernst du nicht die Grundlagen, bevor du mit sowas anfängst?

                        Wieso überschreibt $mdiff $wdiff?
                        Weil du unter einem Array-Schlüssel nur einen Wert bzw. ein Datenobjekt ablegen kannst.

                        Das ist im Prinzip auch nichts anderes, als wenn du folgende zwei Zuweisungen hintereinander schreiben würdest:
                        PHP-Code:
                        $x 15;
                        $x 23
                        Da erwartest du doch wohl auch nicht, in $x jetzt irgendwie beide Werte vorzufinden, oder?

                        Würde ich ja gern - das sieht sehr gut aus - ich weiss aber nicht wie ich ein solches Konstrukt auslese
                        Grundlagen ...

                        Kommentar


                        • #13
                          Ich möchte mich hier nicht streiten, ich möchte etwas lernen.
                          Das ist der Grund, warum ich in diesem Forum - übrigens bei Einsteiger - schreibe und Hilfe bei einem Problem suche das meine momentanen Kenntnisse überfordert.

                          Wirkliche Grundlagen denke ich schon zu beherrschen. Mir ist klar, dass $x bei einer zweiten Zuweisung überschrieben würde.
                          Meine Variablen hießen aber $mdiff ("m", wie Menge) und $wdiff ("w", wie Wert).
                          OK? Können wir dann zurück zur Sache kommen?

                          Wo im PHP-Manual steht das? Unter welchen Begriffen müsste ich hier im Forum suchen oder nach was googlen um diese "Grundlage" zu finden?

                          Im PHP-Manual findet sich auch nur die ganz normale foreach-Schleife um eindimensionale Arrays auszulesen.
                          Die dürftigen Beispiele mit mehrdimensionalen Arrays erschöpfen sich darin, die Werte einzeln oder mit print_r() auszulesen.

                          _Einen_ Wert bei deinem Beispiel zu bekommen ist mir vermutlich schon klar, das ginge wohl mit
                          PHP-Code:
                          $arraydaten $data['Filiale4711'][2012]; 
                          $arraydaten könnte ich dann ganz normal mit foreach auslesen. Damit habe ich aber nur eine Position aus $data.
                          Gibt es hier auch eine Möglichkeit mit foreach zu arbeiten?
                          Oder lasse ich das $data durch zwei Schleifen, eine "äußere" und eine "innere", laufen?

                          Sorry noch mal wenn ich so blöd fragen muss, aber ich habe hierzu keine Beispiele gefunden.

                          Kommentar


                          • #14
                            Zitat von HiddenX Beitrag anzeigen
                            Mir ist klar, dass $x bei einer zweiten Zuweisung überschrieben würde.
                            Meine Variablen hießen aber $mdiff ("m", wie Menge) und $wdiff ("w", wie Wert).
                            Ja - aber die standen in dem Code, auf den meine Anmerkung bezogen war, auf der rechten Seite einer Zuweisung - und links stand zwei mal das gleiche.

                            Im PHP-Manual findet sich auch nur die ganz normale foreach-Schleife um eindimensionale Arrays auszulesen.
                            Die dürftigen Beispiele mit mehrdimensionalen Arrays erschöpfen sich darin, die Werte einzeln oder mit print_r() auszulesen.
                            Auf der nächsten Ebene geht's ganz genauso.

                            Gibt es hier auch eine Möglichkeit mit foreach zu arbeiten?
                            Wozu? Wozu überhaupt eine Schleife?

                            Die genaue Struktur der Daten auf der zweiten Ebene ist dir doch bekannt, schließlich erstellst du sie selbst explizit.
                            Dann kannst du doch an der Stelle, wo du ein bestimmtes Element dieser Daten haben willst, gleich direkt mit dem entsprechenden Index darauf zugreifen.

                            Wirkliche Grundlagen denke ich schon zu beherrschen.
                            Deine Fragen hier lesen sich aber anders.

                            Vorschlag: Lerne erst mal mit Arrays umzugehen, losgelöst vom aktuellen Projekt. Erstelle dir selber Beispieldaten (müssen nicht unbedingt irgendeine wirkliche Bedeutung haben) - und schau dann, wie sich damit umgehen lässt, wenn du Schleifen verwendest, direkte Zugriffe, etc.
                            Schau dir auch die Array-Funktionen an, um wenigstens schon mal ein ungefähres Gefühl dafür zu bekommen, welche sich für was eignen und wie sie sich anwenden lassen.

                            Kommentar


                            • #15
                              Zitat von ChrisB Beitrag anzeigen
                              Ja - aber die standen in dem Code, auf den meine Anmerkung bezogen war, auf der rechten Seite einer Zuweisung - und links stand zwei mal das gleiche.
                              Was mich wirklich ärgert, ist dass wir hier mehr besserwisserische Diskussionen führen, als zur Lösung meiner Frage beizutragen.
                              Aber wer will schon als blöd hingestellt werden- also mach' Dir bitte die Mühe und schau' mein Beispiel noch mal genau an. Du wirst feststellen, dass die beiden Variablen (ja, auch die auf der linken Seite) sich natürlich unterscheiden.

                              Zitat von ChrisB Beitrag anzeigen
                              Wozu? Wozu überhaupt eine Schleife?
                              Weisst du noch worum es geht? Es geht darum alle Filialen (der erste Teil des Arrays) in allen Jahren (der zweite Teil des Arrays) in einer Tabelle auszugeben.
                              Meine Frage war: Gibt es hier eine Möglichkeit mit foreach zu arbeiten, oder lasse ich das Array durch zwei schleifen laufen. Einmal um alle Filialen auszugeben und darin nochmal eine Schleife für alle Jahre.

                              Zitat von ChrisB Beitrag anzeigen
                              Die genaue Struktur der Daten auf der zweiten Ebene ist dir doch bekannt, schließlich erstellst du sie selbst explizit.
                              Dann kannst du doch an der Stelle, wo du ein bestimmtes Element dieser Daten haben willst, gleich direkt mit dem entsprechenden Index darauf zugreifen.
                              Jepp. Das ist auch nicht das Problem.

                              Zitat von ChrisB Beitrag anzeigen
                              Deine Fragen hier lesen sich aber anders.
                              Vielleicht werden sie auch nur nicht richtig verstanden?

                              Zitat von ChrisB Beitrag anzeigen
                              Vorschlag: Lerne erst mal mit Arrays umzugehen
                              Ich kann mit normalen Arrays umgehen. Nur mehrdimensionale Arrays sind für mich etwas neues. Hier hatte ich mir eine Hilfestellung erhofft und kein Assessment.
                              Es wäre schön, wenn auf einfache Fragen auch einfache Antworten gegeben würden, ohne gleich die Empfehlung auszusprechen wieder mit echo 'Hallo Welt'; anzufangen.

                              Kommentar

                              Lädt...
                              X