Announcement

Collapse
No announcement yet.

Abfrage mit Join / abhängigkeiten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Abfrage mit Join / abhängigkeiten

    Hallo Zusammen, mein Wissen mit mySQL beschränkt sich seeeeehr auf die Basics, deshalb habe ich auch bereits hier Probleme...also ich habe folgenden Code:

    PHP Code:
    SELECT  kmlKorrekturmeldungen.*, DATE_FORMAT(Erfasst'%d.%m.%Y') as ErfasstDATE_FORMAT(Erledigt'%d.%m.%Y') as Erledigt kmlSprache.Bezeichnung as SprachekmlBeruf.Bezeichnung as Beruf
    kmlLehrgang.Bezeichnung as LehrgangkmlAusgabe.Bezeichnung as AusgabekmlRegister.Bezeichnung as Register 
    FROM kmlKorrekturmeldungen LEFT JOIN 
    (kmlSprachekmlBerufkmlLehrgangkmlAusgabekmlRegister)
        
    ON (
              
    kmlKorrekturmeldungen.fkSprache  kmlSprache.pkSprache   AND 
              
    kmlKorrekturmeldungen.fkBeruf    kmlBeruf.pkBeruf       AND 
              
    kmlKorrekturmeldungen.fkLehrgang kmlLehrgang.pkLehrgang AND 
              
    kmlKorrekturmeldungen.fkAusgabe  kmlAusgabe.pkAusgabe   AND 
              
    kmlKorrekturmeldungen.fkRegister kmlRegister.pkRegister
               

    order by Erfasst 
    Wenn in allen "fk" Feldern ein gültiger FK drinsteht (wecher in den zu "joinenden" Tabellen vorhanden ist) - so gibt mir mySQL (logischwerweise) nachher für alle fk-Felder die entsprechenden und korrekten Werte zurück.

    Mein Problem ist jetzt aber, dass ich NICHT immer alle FKs habe, d.h. es kann druchaus sein, dass nur fkSprache und fkBeruf vorhanden sind - diese zeigen dann auf einen korrekten Datensatz in den entsprechenden Tabellen - gleichzeitig sind aber alle übrigen FKs auf den Wert "0" gesetzt (welcher NICHT in den entsprechenden Tabelle vorhanden ist (kann ihn auch nicht erstellen, da überall autoincrement ist)). Jetzt gibt mir SQL leider direkt FÜR ALLE FKs leere Werte zurück, d.h. auch für die, die eigentlich vorhanden sind (Sprache und Beruf), der Grund dafür sind vermutlich die ANDs ... weiss aber nicht wie ich die Abfrage sonst schreiben müsste (mit OR gehts ja schon mal nicht).

    Ich hoffe konnte mich halbwegs verständlich ausdrücken.

    Danke für die Hilfe.
    Zuletzt editiert von Radon; 17.12.2009, 12:43.

  • #2
    Hi,

    versuch es mal so:

    [highlight=sql]
    SELECT

    kmlKorrekturmeldungen.*, DATE_FORMAT(Erfasst, '%d.%m.%Y') as Erfasst, DATE_FORMAT(Erledigt, '%d.%m.%Y') as Erledigt , kmlSprache.Bezeichnung as Sprache, kmlBeruf.Bezeichnung as Beruf,
    kmlLehrgang.Bezeichnung as Lehrgang, kmlAusgabe.Bezeichnung as Ausgabe, kmlRegister.Bezeichnung as Register

    FROM kmlKorrekturmeldungen
    LEFT JOIN kmlSprache ON kmlKorrekturmeldungen.fkSprache = mlSprache.pkSprache
    LEFT JOIN kmlBeruf ON kmlKorrekturmeldungen.fkBeruf = kmlBeruf.pkBeruf
    LEFT JOIN kmlLehrgang ON kmlKorrekturmeldungen.fkLehrgang = kmlLehrgang.pkLehrgang
    LEFT JOIN kmlAusgabe ON kmlKorrekturmeldungen.fkAusgabe = kmlAusgabe.pkAusgabe
    LEFT JOIN kmlRegister ON kmlKorrekturmeldungen.fkRegister = kmlRegister.pkRegister

    ORDER BY Erfasst
    [/highlight]
    "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

    Viele Grüße Novi

    Comment


    • #3
      Vielen vielen Dank! Scheint zu funktionieren - dass ich da nicht selbst drauf gekommen bin.... danke!

      Comment


      • #4
        Originally posted by Radon View Post
        (..) der Grund dafür sind vermutlich die ANDs ... weiss aber nicht wie ich die Abfrage sonst schreiben müsste (mit OR gehts ja schon mal nicht).
        Den Grund hattest du ja quasi schon erkannt.
        "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

        Viele Grüße Novi

        Comment


        • #5
          Hallo,
          Originally posted by Novi View Post
          Den Grund hattest du ja quasi schon erkannt.
          zumindest zur Hälfte

          Im rechten Teil seines JOIN wird quasi ein kartesisches Produkt erzeugt, welches durch die mit AND verknüpften Bedingungen auf die DS eingeschränckt wird, die ALLE Bedingungen erfüllen. Mit dem "zusammengestrichenen" kartesischen Produkt wird dann der LEFT JOIN ausgeführt. Das ursprüngliche Statement ist also zwar syntaktisch richtig, für die konkrete Aufgabenstellung aber schon vom Ansatz her falsch.

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Ein Foreign Key hat mit einer Abfrage normalerweise nichts zu tun (ausser das ist bei MySQL anders).
            Normalerweise dient ein Foreign Key nur dazu die Integrität der Daten zu gewährleisten. Das heisst wenn in einem Feld dem FK zugeordnet ist ein Wert steht, dann muss auch in der anderen Tabelle dieser Wert existieren.
            Deswegen werden FKs auch in die Kategorie Constraints eingeordnet.

            Comment


            • #7
              Radon hat hier wahrscheinlich nur Spalten die Id's enthalten, die sich wiederum auf eine private Id in einer anderen Tabelle beziehen. Sie sind also quasi ForeignKeys, auch wenn sie wahrscheinlich nicht als solche definiert sind. Schließlich sind bei ihm auch ungültige Id's als ForeignKeys (z.B. 0) möglich.
              "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

              Viele Grüße Novi

              Comment


              • #8
                Originally posted by Novi View Post
                Radon hat hier wahrscheinlich nur Spalten die Id's enthalten, die sich wiederum auf eine private Id in einer anderen Tabelle beziehen. Sie sind also quasi ForeignKeys, auch wenn sie wahrscheinlich nicht als solche definiert sind. Schließlich sind bei ihm auch ungültige Id's als ForeignKeys (z.B. 0) möglich.
                Absolut richtig - Ich habe die Spalte nicht als FK im eigentliche Sinne definiert (direkt im SQL), sonder einfach nur so beschrifet und sie werden quasi auch als solche benutzt (zeigen jweils auf die PKs der anderen Tabellen) - da es aber sein kann, dass manchmal nicht alle Felder ausgefüllt werden (das ganze geht auf ein html formular zurück, kann deshalb ein "FK" auch 0 sein, also zu nichts gehören).

                -

                Mein Problem war halt, dass ich einfach mal "join" eingegeben habe, bei google, die erst beste seite (offizielle mysql seite) genommen habe und dann einfach aus dem ersten Beispiel abgeschrieben habe :> Da war alles mit AND drin - und ich (depp ^^) bin dann natürlich nicht auf die idee gekommen, dass man problemlos mehrere joins einzeln hinschreiben kann, obwohl es eigentlich logisch ist und ich es irgendwann auch mal gewusst hatte

                Danke nochmals für eure Antworten.

                Comment

                Working...
                X