Viele Tabellen und Spalten (Verwirrung?)

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

  • Viele Tabellen und Spalten (Verwirrung?)

    Zuerst die Definition der Tabellen, für den Überblick


    Tbl_zuordnung PLZ Zuordnung zu Gebieten
    ---------------------------------------
    ID
    Gebiets_id (aus Tbl_plz_gebiete)
    PLZ
    Land_der_plz


    Tbl_plz_gebiete
    ---------------
    ID
    Gebietsbezeichnung
    Gebietstyp
    Staat

    plz_stammdaten
    ----------------
    ID
    Stammdaten_plz
    Stammdaten_ort

    Angebotstabelle
    ----------------------
    ID
    Kategorie
    Region_name
    Region_id (ID aus Tbl_plz_gebiete)
    Preis
    beschreibung
    Warengruppenid



    PHP-Code:
    SELECT     Angebotstabelle.IDAngebotstabelle.C001Angebotstabelle.C002
    Angebotstabelle.C005
    FROM      Tbl_plz_gebiete
    Angebotstabelle
    WHERE    

    Angebotstabelle.Warengruppenid 12  OR 
    Angebotstabelle.Warengruppenid 26  OR 
    Angebotstabelle.Warengruppenid 27  OR 
    Angebotstabelle.Warengruppenid 28  OR 
    Angebotstabelle.Warengruppenid 29  OR 
    Angebotstabelle.Warengruppenid 30  OR 
    Angebotstabelle.Warengruppenid 31  OR
    Angebotstabelle.Warengruppenid 32  OR 
    Angebotstabelle.Warengruppenid 33  OR 
    Angebotstabelle.Warengruppenid 34  OR 
    Angebotstabelle.Warengruppenid 35  OR Angebotstabelle.Warengruppenid 36  OR 

    Angebotstabelle.Warengruppenid 37  OR Angebotstabelle.Warengruppenid 38  OR 

    Angebotstabelle.Warengruppenid 39  OR 
    Angebotstabelle.Warengruppenid 40  )

    AND 
    Tbl_plz_gebiete.Staat 'DE' 
    AND Tbl_plz_gebiete.ID Angebotstabelle.Staat
    GROUP BY Angebotstabelle
    .Region_name
    ORDER BY Angebotstabelle
    .Region_name 

    Diese Abfrage gibt folgendes aus
    142 Luftsport & Weltraum > Ballonfahren > Alle Startpl... Aachen 229.00
    1445 Luftsport & Weltraum > Ballonfahren > Alle Startpl... Aachener Dom 229.00
    1582 Luftsport & Weltraum > Ballonfahren > Alle Startpl... Aachener Rathaus 229.00
    .
    .
    .



    Und ich möchte ich gerne einen Filter erstellen, der mir alle Angebote in einem speziellem Regierungsbezirk bzw. landeskreis anzeigt

    Die Landkreis und die Regierungsbezirke stehen in der PLZ Gebiete ->
    Tbl_plz_gebiete.Gebietsbezeichnung
    das heißt ich müsste über die Zuordnungstabelle Tbl_zuordnung gehen und die Postleitzahlen aus
    plz_stammdaten laden und vergleichen mit der Ausgabe meiner SQL Abfrage.

    Hat da vielleicht irgendjemand eine Idee wie ich dieses bewerkstelligen kann?

  • #2
    JOINS, das leidige Thema! Such dir den passenden raus.

    Kommentar


    • #3
      Gedacht und probiert hab ich es auch Naja wenn das damit möglich ist, werd ich es mal testen.
      Dank dir

      Kommentar


      • #4
        Code:
        Angebotstabelle.Warengruppenid = 12  OR 
        Angebotstabelle.Warengruppenid = 26  OR 
        Angebotstabelle.Warengruppenid = 27  OR 
        Angebotstabelle.Warengruppenid = 28  OR 
        Angebotstabelle.Warengruppenid = 29  OR 
        Angebotstabelle.Warengruppenid = 30  OR 
        Angebotstabelle.Warengruppenid = 31  OR
        Angebotstabelle.Warengruppenid = 32  OR 
        Angebotstabelle.Warengruppenid = 33  OR 
        Angebotstabelle.Warengruppenid = 34  OR 
        Angebotstabelle.Warengruppenid = 35  OR
        Angebotstabelle.Warengruppenid = 36  OR 
        Angebotstabelle.Warengruppenid = 37  OR
        Angebotstabelle.Warengruppenid = 38  OR 
        Angebotstabelle.Warengruppenid = 39  OR 
        Angebotstabelle.Warengruppenid = 40
        Kürzer:
        Code:
        Angebotstabelle.Warengruppenid IN (12, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40)
        Außerdem kannst du mit AS Tabellennamen ein Alias geben und musst nicht jedesmal den vollen Namen ausschreiben.

        Kommentar


        • #5
          Oh, danke das erleichtert einige Schreibarbeit

          Kommentar


          • #6
            Ich habe da mal was gebastelt

            PHP-Code:
            SELECT plz_stammdaten.C001plz_stammdaten.C002
            FROM plz_stammdaten

            LEFT OUTER JOIN Tbl_zuordnung 
            ON 
            (Tbl_zuordnung.PLZ plz_stammdaten.Stammdaten_plz)
            LEFT OUTER JOIN Tbl_plz_gebiete 
            ON 
            (Tbl_plz_gebiete.ID '6748'
            Leider bekomme ich immer ein gone away von meinem SQL Server.
            Ich muss dazu sagen das die T132 über 1 Millionen Datensätze besitz. Kann man das irgendwie optimieren? Das diese schneller funktioniert?

            Das ist jetzt erstmal Step1 lade alle Postleitzahlen aus einer bestimmten Region (hier 6748 = NRW)

            Oder soll ich einen View erstellen, oder gibt es da irgendwas?

            Danke

            Kommentar


            • #7
              Hallo,

              ja, du kannst Indices auf die Join-Spalten setzen und dann musst du im Join die Tabellen verknüpfen.

              ON (Tbl_plz_gebiete.ID = '6748')

              womit ist die id denn verknüpft? oder soll bei jedem Query genau diese Spalte mit ausgegeben werden???
              signed oder unsigned... das ist hier die Frage

              Kommentar


              • #8
                So ich habe das Problem hinbekommen, leider hat sich ein neues Problem ergeben. Wie immer halt

                Die Abfrage dauert 6 -10 sekunden
                ist es möglich mit indices irgendwie zwei tabellen / spalten zu verbinden

                in etwas so

                Tabelle_x.PLZ = Tabelle_y.PLZ

                und dann diese mit indices zu verbinden ?

                Oder ist eine Optimierung irgendwie anders möglich?

                Mit Optimierungen kenne ich mich leider nicht so aus, nur so ist es eine Zumutung
                Zuletzt geändert von none; 22.07.2008, 22:30.

                Kommentar


                • #9
                  Sorry hab den SQL Befehl vergessen.

                  Diese Ausgabe dauert ca. 6 Sekunden
                  PHP-Code:
                  SELECT        Angebotstabelle.ID
                              
                  Angebotstabelle.Kategorie
                              
                  Angebotstabelle.Region_name
                              
                  AngebotstabelleRegion_id
                              
                  Angebotstabelle.preis 
                              
                  Tbl_zuordnung.Gebiets_id
                              
                  Tbl_plz_gebiete.staat
                              
                  plz_stammdaten.Stammdaten_plz
                              
                  plz_stammdaten.Stammdaten_ort as ORT 

                  FROM         plz_stammdaten

                              
                  Tbl_zuordnung
                              
                  Angebotstabelle
                              
                  Tbl_plz_gebiete 

                  WHERE         Angebotstabelle
                  .C008 
                              IN 
                  12 ,26 ,27 ,28 ,29 ,30 ,31 ,32 ,33 ,34 ,35 ,36 ,37 ,38 ,39 ,40 
                  AND         
                  Tbl_zuordnung.Region_id Angebotstabelle.Region_id 
                  AND            plz_stammdaten.Stammdaten_plz Tbl_zuordnung.PLZ 
                  AND         Tbl_plz_gebiete.ID Tbl_zuordnung.Gebiets_id
                  AND         Tbl_zuordnung.staat 'DE' 
                              
                  AND Tbl_plz_gebiete.ID '6748' (Regionsid aus Tbl_plz_gebiete )
                              
                  GROUP BY     ORT 
                  ORDER BY     Angebotstabelle
                  .Kategorie 

                  Kommentar


                  • #10
                    Wenn du ein «GROUP BY ort» in der Abfrage hast, bekommst du für alle andern Attribute sowieso nur Zufallswerte. Deshalb macht es gar keinen Sinn, diese Abfrage - für die alle andern Datenbanksysteme ausser MySQL eine Fehlermeldung generieren würden - optimieren zu wollen.
                    Gruss
                    H2O

                    Kommentar


                    • #11
                      Also die Ausgabe ist in Ordnung, group by Ort hab ich rausgenommen.
                      Ist auch schon wesentlich schneller geworden.

                      Das Problem ist jetzt noch, dass dieWarengruppen ( 12 ,26 ,27 ,28 ,29 ,30 ,31 ,32 ,33 ,34 ,35 ,36 ,37 ,38 ,39 ,40 ) hier fix sind.
                      D.h. das ist begrenzt. Aber ich brauch das als unbegrenzte ausgabe, dann dauert es leider immernoch 3 sek. Zu langsam bei 9 - 11000 Besucher täglich

                      Kommentar


                      • #12
                        Vielleicht bist du so freundlich und liest dir nochmal die erste Antwort durch. Bevor das nicht berücksichtigt wurde, brauchst du dich über zu lange Zeiten wohl nicht beschweren...

                        Kommentar


                        • #13
                          Hallo TobiaZ,

                          danke für deine Antwort.

                          Ist es also wirklich so, das Joins wesentlich schneller sind?
                          Ich habe mir das durchgelesen, nur war 'ich' der Meinung, dass es lediglich ein Umstellen der SQL Abfrage ist, weil ob ich nun so die gesamten PLZs durchgehe oder ob ich mit LEFT JOIN die gesamte Tabelle lade, für mich ergibt das keinen Sinn …

                          Vielleicht irre ich mich, dann entschuldigt dieses bitte

                          Kommentar


                          • #14
                            Also ich hab das ja sicher nicht einfach so zum Spaß oder als nettes Gimmick als erste Antwort geschrieben. Kannst also schon davon ausgehen, dass deine Abfrage davon beschleunigt wird. Wobei man das eigentlich als Normalzustand ansehen sollte.

                            Du erzeugst aktuell ein Kartesisches Produkt von mehreren Tabellen. Also alles mit allem gekreuzt. Da ist es doch klar, dass das mehr Speicher und somit auch Performance frisst, als wenn du nur die Datensätze miteinander verbindest, die auch wirklich zusammen gehören.

                            Kommentar


                            • #15
                              Hallo,

                              ich habe mich jetzt mal mit den einzelnen Joins befasst und ich muss sagen, es ist besser geworden

                              Leider habe ich noch immer eine Laufzeit von 5 Sek

                              hier nochmal der Code, vielleicht habt ihr ja noch eine Idee wie ich den Code verbessen (vorallem verschnellern) kann

                              Vielen Dank im Vorraus
                              PHP-Code:
                               SELECT AngebotstabelleStammdaten_ort.ORT
                              plz_stammdate.plzAngebotstabelle.kategorieAngebotstabelle.region_nameAngebotstabelle.preis
                              Tbl_plz_gebiete.Gebietsname
                              FROM tbl_zuordnung
                              LEFT JOIN Tbl_plz_gebiete ON Tbl_plz_gebiete
                              .ID tbl_zuordnung.gebietsid
                              LEFT JOIN plz_stammdate ON Tbl_zuordnung
                              .plz plz_stammdate.plz
                              LEFT JOIN Angebotstabelle ON Angebotstabelle
                              .regions_id Tbl_plz_gebiete.ID
                              WHERE Tbl_plz_gebiete
                              .ID '6748'
                              GROUP BY Angebotstabelle.ID
                              ORDER BY Angebotstabelle
                              .ID ASC 

                              Kommentar

                              Lädt...
                              X