Sinnvolle Abfrage

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

  • Sinnvolle Abfrage

    Sorry, ich weiß, dass solche Posts eigentlich voll der Kack sind, aber mich würde das mal generell interessieren, ob ich die Anfrage hier sinnvoll gestaltet hab, oder ob ich da mit JOIN arbeiten muss. Das Ergebnis, was ich bekomme, ist korrekt. Nur ob die Anfrage sinnvoll gestaltet ist, würde mich interessieren.

    PHP-Code:
    $sql "SELECT t.buchbar, r.r_id, r.titel, r.tage
            ,DATE_FORMAT(abreise,'%d.%m.%Y') AS abreise
            ,DATE_FORMAT(abreise  + INTERVAL r.tage DAY - INTERVAL 43200 SECOND,'%d.%m.%Y') AS rueckreise 
        FROM k_termine_bac AS t, k_reisen_bac AS r 
        WHERE MONTH(t.abreise) = '
    $_GET[monat]' AND t.r_id = r.r_id
        ORDER BY abreise"


  • #2
    Na ja, deine Abfrage ist ja auch ein JOIN..
    Ich würde mal die Ausgaben von EXPLAIN ... vergleichen. Je höher das Produkt der einzelnen "rows" Angaben ist, desto langsamer die Abfrage..
    [color="#334D7B"]"Los, lass uns loslegen! Hm ? Quatschen können wir hinterher immer noch!"[/color]
    [color="#9C5245"]"Aber Bommel, wir können jetzt nicht bumsen. Wir müssen doch erst den Kindern - ... "[/color]
    [color="#334D7B"]"Ja ja ja. Du willst immer nur das Eine. Buchstabenzeigen, Buchstabenzeigen - meine Gefühle sind dir wohl scheißegal."[/color]

    © Harald Schmidt

    Kommentar


    • #3
      ich würde es auf jeden fall mit einem JOIN machen. der bildet so nicht das kreuzprodukt aller daten.

      PHP-Code:
      $sql "SELECT    t.buchbar,
                        r.r_id,
                        r.titel,
                        r.tage,
                        DATE_FORMAT(abreise,'%d.%m.%Y') abreise,
                        DATE_FORMAT(abreise  + INTERVAL r.tage DAY - INTERVAL 43200 SECOND,'%d.%m.%Y') rueckreise

              FROM      k_termine_bac t
                          LEFT OUTER JOIN k_reisen_bac r USING(r_id)
          
              WHERE     MONTH(t.abreise) = '"
      .$_GET[monat]."'
              
              ORDER BY  abreise"

      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


      Kommentar


      • #4
        Jo, dank euch beiden.

        Ich bin eben immer noch nicht ganz in der Materie JOIN drin. meine Idee joint ja auch irgendwie... Was meinst du denn genau mit Kreuzprodukt(@abraxax)?

        Über LEFT OUTER hatte ich auch schon nachgedacht. Aber ich konnte die Seite mit den geilen Beispielen (Mitarbeiter, Abteilung) nicht finden. Auf MySQL sind irgendwie keine schönen Beispiele.

        Ich werd mal sehen, was ich noch machen kann.

        Kommentar


        • #5
          Deine Abfrage erkennt nur Datensäatze bei denen t.r_id auch in t als t.r_id vorhanden ist.
          Ein LEFT JOIN zB gibt Dir alle DS aus der linken Tabelle mit dazugehörigen DS aus der Rechten Tabelle auch wenn r.r_id null ist.
          Beantworte nie Threads mit mehr als 15 followups...
          Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

          Kommentar


          • #6
            Original geschrieben von TobiaZ
            Was meinst du denn genau mit Kreuzprodukt(@abraxax)?
            angenommen du hast zwei tabelle á 100 einträge.

            wenn du FROM tab1,tab2 machst, hast du erst einmal 10.000 ergebnisse in der abfrage (kreuzprodukt)

            erst später wird durch WHERE das ergebnis gebildet.

            bei LEFT OUTER werden erst einmal die 100 der tab1 genommen und entsprechend die werte aus tab2 denen der tab1 (LEFT) zugeordnet. damit hast 9.900 rückgaben gespart. und das geht dann auch schneller...
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              Mellow: Das heißt, ich muss in beiden Tabellen den gleichen Spaltennamen verwenden, oder?

              Deine Abfrage erkennt nur Datensäatze bei denen t.r_id auch in t als t.r_id vorhanden ist.
              Ich nehme an, das sollte ein mal r.r_id heißen.

              Kommentar


              • #8
                ja klar einmal r.r_id

                Nehmen wir an Deine Tabelle t sieht so aus:
                buchbar,r_id
                y,1
                n,2
                r,3
                e,4

                und r so
                r_id,titel,abreise
                1,a,2003-03-28
                3,b,2003-04-01

                Dann ergibt ein SQL mit:
                FROM k_termine_bac AS t, k_reisen_bac AS r
                WHERE t.r_id = r.r_id

                nur die Datensätze aus t in denen r_id in beiden Tabellen vorhanden ist
                zB.
                buchbar,r_id,titel,abreis
                y,1,a,2003-03-29
                r,3,b,2003-04-01

                Bei einem
                FROM t LEFT JOIN r ON t.r_id=r.r_id
                kommt:
                buchbar,r_id,titel,abreis
                y,1,a,2003-03-29
                n,2,null,null
                r,3,b,2003-04-01
                e,4,null,null
                Beantworte nie Threads mit mehr als 15 followups...
                Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

                Kommentar


                • #9
                  WOW, Danke für die ausführliche Erklärung!

                  der unterschied ist für mich nicht so groß, da ich eigentlich zu jedem Eintrag nen passenenden Eintrag in der anderen DB hab. Korrekter wäre allerdings die zweite Lösung, obwohl die erste besser aussieht (wegen den leeren Einträgen null).

                  Ich habs jetzt mit nem OUTER JOIN gelöst. Denke mal das geht klar!?

                  Kommentar

                  Lädt...
                  X