Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Abfrage aus mehreren Tabellen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Abfrage aus mehreren Tabellen

    Hallo allerseits,

    ich hoffe ich bin hier richtig, ich denke es ist eher ein mySQL, als ein PHP-"Problem":

    Ich möchte aus vier Tabellen, die alle vom Aufbau her identisch sind, nur verschiedene Daten beinhalten, jeweils eine Abfrage über ein Feld durchführen. (Jede Tabelle beinhaltet die Umsätze aller Filialen für ein Jahr)

    Momentan mache ich das so, dass ich die Abfragen viermal hintereinander durchführe:
    PHP-Code:
            // Abfrage Umsatz 2007
            
    $sql2007    =   'SELECT * FROM ums2007 WHERE FILIALE = "'.$filiale.'"';
            
    $result2007 =   mysql_query($sql2007) OR die(mysql_error());
            
    $row2007    =   mysql_fetch_assoc($result2007);
            
    $umsatz2007 =   $row2007['Umsatz'];
            
    // Abfrage Umsatz 2008
            
    $sql2008    =   'SELECT * FROM ums2008 WHERE FILIALE = "'.$filiale.'"';
            
    $result2008 =   mysql_query($sql2008) OR die(mysql_error());
            
    $row2008    =   mysql_fetch_assoc($result2008);
            
    $umsatz2008 =   $row2008['Umsatz'];
    ... 
    uswfür 2009 und 2009 
    Das finde ich natürlich super-umständlich und ist bestimmt auch langsamer, als wenn ich alles in einen SELECT packen könnte, etwa so?

    PHP-Code:
            $sql     =   'SELECT * FROM ums2007,ums2008,ums2009,ums2010
                                          WHERE ums2007.FILIALE = "'
    .$filiale.'"
                                          AND ums2008.FILIALE = "'
    .$filiale.'"
                                          AND ums2009.FILIALE = "'
    .$filiale.'"
                                          AND ums2007.FILIALE = "'
    .$filiale.'"';
            
    $result =   mysql_query($sql2008) OR die(mysql_error());
            
    $row    =   mysql_fetch_assoc($result2008);
            
    $umsatz =  $row['Umsatz'];   

    Die Abfrage funktioniert ja auch, aber wie komme ich jetzt an die Daten? Ich sehe wohl den Wald gerade vor Bäumen nicht mehr, aber $umsatz beinhaltet natürlich immer nur ein Jahr- ich will aber alle vier!
    $umsatz = $row['ums2007.Umsatz'] geht natürlich auch nicht
    Kann mir jemand einen Tipp geben, wie ich alle Jahre ausgeben kann?

    Vielen Dank schon mal für die Hilfe
    HiddenX


  • #2
    Code:
    SELECT
        ums2007.Umsatz AS Umsatz2007,
        ums2008.Umsatz AS Umsatz2008,
        ums2009.Umsatz AS Umsatz2009,
        ums2010.Umsatz AS Umsatz2010
    FROM ums2007, ums2008, ums2009, ums2010
    WHERE ...
    SELECT * ist Scheiße; zähle die Spalten, die du haben willst, explizit auf.

    Übrigens: auch jetzt werden vier Abfragen gemacht, die sind nur wie eine einzige Abfrage formuliert. Performance gewinnst du dadurch nur, weil die Abfrage nicht vier mal zum Datenbankserver gesendet und dort geparst werden muss.

    Alternativ:
    Code:
    SELECT Umsatz, '2007' AS Jahr FROM ums2007 WHERE ...
    UNION
    SELECT Umsatz, '2008' AS Jahr FROM ums2008 WHERE ...
    UNION
    SELECT Umsatz, '2009' AS Jahr FROM ums2009 WHERE ...
    UNION
    SELECT Umsatz, '2010' AS Jahr FROM ums2010 WHERE ...
    Auch hier sind es wieder vier Abfragen, aber du hast alle Umsätze in der gleichen Spalte der Ergebnismenge.

    Die Idee, für jedes Jahr eine eigene Tabelle aufzubauen, finde ich auch nicht so toll.
    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

    Kommentar


    • #3
      Zitat von mimomamu Beitrag anzeigen
      [CODE]SELECT * ist Scheiße; zähle die Spalten, die du haben willst, explizit auf.
      Generell gebe ich Dir Recht, in dem Fall sind es aber eh nur 2 Felder.
      Abgesehen davon, dass das aufzählen in dem Fall meiner Meinung nach unnötig und umständlich wäre hilft es auch nicht wirklich weiter, oder?

      Kommentar


      • #4
        Weiterhelfen tut es nicht, tun solltest du es aber dennoch, egal, wie wenige oder viele Spalten es sind:

        Wie mimomamu schon angedeutet hat, solltest du nicht für jedes Jahr eine neue Tabelle anlegen. Erstelle stattdessen eine Tabelle für die Jahre und weise jedem Jahr eine ID zu. Diese ID trägst du in die Tabelle für die Umsätze in einer separaten Spalte ein, um eine Zugehörigkeit des Datensatzes zum Jahr festzulegen.

        Normalisierung (Datenbank) – Wikipedia

        Gruß
        http://hallophp.de

        Kommentar


        • #5
          Zitat von HiddenX Beitrag anzeigen
          Generell gebe ich Dir Recht, in dem Fall sind es aber eh nur 2 Felder.
          Das hat nichts mit der Anzahl der Felder zu tun, sondern mit Dokumentation,

          Beispiel: Wenn ich
          Code:
          SELECT * FROM users
          ausführe und dann die Datensätze ausgeben lasse
          PHP-Code:
          while ($record mysql_fetch_assoc($result)) {
            echo 
          $record['email'];

          dann bekomme ich keine Ausgabe, obwohl zumindest einige Benutzer eine E-Mail-Adresse angegeben haben. Wenn ich stattdessen
          Code:
          SELECT email FROM users
          ausführe, dann würde der Datenbankserver sofort meckern, weil die Spalte nämlich `e-mail` heißt, nicht `email`.
          Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

          Kommentar


          • #6
            Btw. Wieso trägst du das Jahr nicht einfach als Integer oder Datum in eine Spalte der Umsatztabelle ein? Dann weist du doch, um welches Jahr es sich handelt! Ein zweite Tabelle ist dafür nicht mal notwendig.
            http://hallophp.de

            Kommentar


            • #7
              Ok, ich bin ja lernfähig und habe die Tabelle um ein Jahres-Feld erweitert. Damit haben sich noch etliche andere Probleme in Luft aufgelöst.

              Danke an alle!

              Kommentar

              Lädt...
              X