Jan: IF in SQL

Hallo Leute!

Habe gerade in altes SQL-Dump erhalten  und habe nun mehrere Tabellen, aus denen ich Daten rausfiltern muss. Hier mal die Tabellennamen mit den benötigten Feldern (in Klammern die Verknüften Felder):

GOLFCLUBS: vereinsname1 (adid)
ADRESSEN: strasse, strasse2, plz, ort, land (adid)
MITARBEITER: bereich, position (pid)
PERSONEN: vorname, nachname, geschlecht, titel, anrede

Nur die Vereine aus Österreich, Deutschland und der Schweiz auszugeben ist kein Problem.

SELECT golfclubs.vereinsname1, adressen.strasse, adressen.strasse2, adressen.plz, adressen.ort, adressen.land FROM vereine, adressen WHERE golfclubs.adid = adressen.adid AND (adressen.land = 'Deutschland' Or adressen.land = 'Schweiz' Or adressen.land = 'Schweiz').

Nun sollte ich aber auch die Geschäftsführer dazu haben.

Nur ist nicht jedem Golfclub ein Geschäftsführer zugehordnet, und hier ist mein Problem ;o(

Sollte also alle Vereine aus A, D und CH inkl. der Adresse und den Geschäftsführer haben (also bereich=verein, position=Geschäftsführer).

Habs schon so versucht:

SELECT golfclubs.golfclubname1, adressen.strasse, adressen.strasse2, adressen.plz, adressen.ort, adressen.land, personen.vorname, personen.nachname, personen.titel, personen.geschlecht, personen.anrede, mitarbeiter.position
FROM golfclubs, adressen, personen, mitarbeiter
WHERE golfclubs.adid = adressen.adid
AND personen.adid = adressen.adid
AND mitarbeiter.pid = personen.pid
AND (
adressen.land = 'Deutschland'
OR adressen.land = 'Österreich'
OR adressen.land = 'Schweiz'
)

Aber das bringt mir überhaupt kein Ergebnis, nicht mal einfach nur alle Vereine, die einen Geschäftsführer haben ;o(

Weiß hier jemand weiter? Es dürfte irgendwie mit IF gehen, bin aber was SQL anbelangt nicht so sehr bewandert.

lg, Jan

  1. Hi,

    GOLFCLUBS: vereinsname1 (adid)
    ADRESSEN: strasse, strasse2, plz, ort, land (adid)
    MITARBEITER: bereich, position (pid)
    PERSONEN: vorname, nachname, geschlecht, titel, anrede

    Ich sehe noch nicht, wo in diesem Schema die Verbindung MITARBEITER (in der Rolle "GESCHÄFTSFÜHRER") mit GOLFCLUBS hergestellt wird...

    Nur ist nicht jedem Golfclub ein Geschäftsführer zugehordnet, und hier ist mein Problem ;o(

    Versuch das mal mit einem LEFT JOIN, links GOLFCLUBS, rechts MITARBEITER. Dann bekommst du für MITARBEITER nur NULL-Werte, wenn es keinen Geschäftsführer gibt, aber immerhin den Verein.

    Weiß hier jemand weiter? Es dürfte irgendwie mit IF gehen, bin aber was SQL anbelangt nicht so sehr bewandert.

    Nun ja, habe es auch noch nicht eingesetzt, dürfte sich aber kaum von anderen Programmiersprachen unterscheiden. Außerdem helfen dir vielleicht IF-Statement (leider nur englisch) und Ablaufsteuerungsfunktionen weiter.

    Der Yeti

    --
    Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
    Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
    Und bin so klug als wie zuvor!
    sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
    1. Hi,

      GOLFCLUBS: vereinsname1 (adid)
      ADRESSEN: strasse, strasse2, plz, ort, land (adid)
      MITARBEITER: bereich, position (pid)
      PERSONEN: vorname, nachname, geschlecht, titel, anrede

      Ich sehe noch nicht, wo in diesem Schema die Verbindung MITARBEITER (in der Rolle "GESCHÄFTSFÜHRER") mit GOLFCLUBS hergestellt wird...

      Sorry, hatte ich ganz vergessen, bei PERSONEN gibt es die Felder pid und adid, d.h. ich kann die position über die Personen den adressen zuordnen über die ich auch zu den Golfclubs komme.

      Sorry, weiß nicht, wie ich das Join oder das IF hier ansetzen soll, die Verschachtelung ist mir etwas zu krass.

      lg, Jan

      1. Hi,

        GOLFCLUBS: vereinsname1, adid
        ADRESSEN: strasse, strasse2, plz, ort, land, adid
        MITARBEITER: bereich, position, pid
        PERSONEN: vorname, nachname, geschlecht, titel, anrede, pid, adid

        OK. Ich versuch mich mal:

          
        SELECT g.vereinsname1, a.strasse, a.strasse2, a.plz, a.ort, a.land FROM golfclubs g NATURAL JOIN adressen a LEFT JOIN personen p USING (adid) LEFT JOIN mitarbeiter m USING (pid) WHERE (a.land = 'Deutschland' OR a.land = 'Schweiz' OR a.land = 'Österreich') AND m.position = 'Geschäftsführer'  
        
        

        (oder wie auch immer die entsprechende Position heißt...)

        HIH,
        Der Yeti

        --
        Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
        Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
        Und bin so klug als wie zuvor!
        sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
        1. Hi,

          GOLFCLUBS: vereinsname1, adid
          ADRESSEN: strasse, strasse2, plz, ort, land, adid
          MITARBEITER: bereich, position, pid
          PERSONEN: vorname, nachname, geschlecht, titel, anrede, pid, adid

          OK. Ich versuch mich mal:

          SELECT g.vereinsname1, a.strasse, a.strasse2, a.plz, a.ort, a.land FROM golfclubs g NATURAL JOIN adressen a LEFT JOIN personen p USING (adid) LEFT JOIN mitarbeiter m USING (pid) WHERE (a.land = 'Deutschland' OR a.land = 'Schweiz' OR a.land = 'Österreich') AND m.position = 'Geschäftsführer'

          
          > (oder wie auch immer die entsprechende Position heißt...)  
          >   
          > HIH,  
          > Der Yeti  
            
          Kommt die gleiche Meldung wie bei meinem SQL, 'Das Statement wurde erfolgreich durchgeführt', aber kein Ergebnis, nicht mal eine einzige Zeile ;o(  
            
          lg, Jan
          
          1. Hi,

            Kommt die gleiche Meldung wie bei meinem SQL, 'Das Statement wurde erfolgreich durchgeführt', aber kein Ergebnis, nicht mal eine einzige Zeile ;o(

            Dann würde ich dir vorschlagen, dass du Schritt für Schritt dein Statement debuggst. Gucke dir zuerst die Ausgabe von "SELECT * FROM golfclubs NATURAL JOIN adressen" an und füge dann immer mehr Elemente hinzu. Ganz zum Schluss würde ich dann erst die Projektion (also "SELECT g.vereinsname1, ...") einbauen.

            Der Yeti

            --
            Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
            Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
            Und bin so klug als wie zuvor!
            sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
            1. Hi,

              Kommt die gleiche Meldung wie bei meinem SQL, 'Das Statement wurde erfolgreich durchgeführt', aber kein Ergebnis, nicht mal eine einzige Zeile ;o(

              Dann würde ich dir vorschlagen, dass du Schritt für Schritt dein Statement debuggst. Gucke dir zuerst die Ausgabe von "SELECT * FROM golfclubs NATURAL JOIN adressen" an und füge dann immer mehr Elemente hinzu. Ganz zum Schluss würde ich dann erst die Projektion (also "SELECT g.vereinsname1, ...") einbauen.

              Der Yeti

              Nein, das funktioniert so leider nicht, ich muss das mit IF machen.

              Sobald ich m.position = 'Geschäftsführer' angebe, bringt er mir nichts mehr, ohne diesen Teil bringt er mir alle Personenfelder als NULL, doch ich weiß dass es bei manchen Clubs welche gibt.

              Ich hatte mal ein super IF, habs auch schon im Archiv gesucht, leider hatte man es mir damals per eMail geschickt, welches ich nicht mehr habe, und auf den Server, wo das Script mit dem SQL liegt, hab ich keinen Zugriff mehr *shit*

              lg, Jan

              1. Hi,

                Nein, das funktioniert so leider nicht, ich muss das mit IF machen.

                Wie kommst du zu diesem Schluss? Anders gesagt: Warum sollte es mit einer IF-Bedingung besser funktionieren als mit einer WHERE-Klausel?

                Sobald ich m.position = 'Geschäftsführer' angebe, bringt er mir nichts mehr, ohne diesen Teil bringt er mir alle Personenfelder als NULL, doch ich weiß dass es bei manchen Clubs welche gibt.

                Das deutet doch darauf hin, dass es keine der pid's aus PERSONEN in GOLFCLUBS und ADRESSEN zu finden sind.
                Suche doch mal ein Beispiel heraus, wo ein GOLFCLUB eine bestimmte adid hat und einer PERSON auch diese adid zugeordnet ist und er sie trotzdem nicht JOINt.

                Der Yeti

                --
                Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
                Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
                Und bin so klug als wie zuvor!
                sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
      2. GOLFCLUBS: vereinsname1 (adid)
        ADRESSEN: strasse, strasse2, plz, ort, land (adid)
        MITARBEITER: bereich, position (pid)
        PERSONEN: vorname, nachname, geschlecht, titel, anrede

        Ich sehe noch nicht, wo in diesem Schema die Verbindung MITARBEITER (in der Rolle "GESCHÄFTSFÜHRER") mit GOLFCLUBS hergestellt wird...

        Sorry, hatte ich ganz vergessen, bei PERSONEN gibt es die Felder pid und adid, d.h. ich kann die position über die Personen den adressen zuordnen über die ich auch zu den Golfclubs komme.

        Probier mal für's erste nur:

        select *
        from GOLFCLUBS AS g LEFT JOIN PERSONEN as p USING(adid)
        LEFT JOIN MITARBEITER AS m USING(pid)
        WHERE m.position = 'Geschäftsführer' AND
        a.land IN('Deutschland', 'Schweiz', 'Österreich')

        Struppi.

  2. echo $begrüßung;

    Weiß hier jemand weiter? Es dürfte irgendwie mit IF gehen, bin aber was SQL anbelangt nicht so sehr bewandert.

    Das sieht nach einem guten Zeitpunkt aus, dass du nun eine weitere Verknüpfungsart kennenlernst.

    Das ist ein INNER JOIN:

    SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.feld = tabelle2.feld

    Das Ergebnis enthält nur Daten, die in beiden Tabellen vorhanden sind.

    Sollen auch die Datensätze von tabelle1 ausgegeben werden, zu denen es keine entsprechenden Datensätze in tabelle2 gibt braucht man einen OUTER JOIN, in dem Fall einen LEFT OUTER JOIN

    SELECT * FROM tabelle1 LEFT JOIN tabelle2 ON tabelle1.feld = tabelle2.feld WHERE ...

    Weitere Informationen zu den JOIN-Arten in MySQL: http://dev.mysql.com/doc/mysql/en/join.html

    Wie dir IF helfen soll, sehe ich momentan nicht. Was genau hattest du dir vorgestellt?

    echo "$verabschiedung $name";

  3. yo,

    die tabelle Golfclub und Adressen gehören zusammen in eine tabelle. das erspart dir schon mal einen JOIN.

    des weiteren kommt dein problem mit dem LEFT JOIN von den anderen vorschlägen daher, dass du in der WHERE Klausel bedingungen aus der letzten tabelle hast (m.position = 'Geschäftsführer') und mysql zuerst die JOIN bedinungen ausführt und erst danach die WHERE bedingungen. da die spalte m.position wohl bei den LEFT JOIN niemals den Wert 'Geschäftsführer' einnimmt, wird er dir immer eine leere menge zurück geben. du kannst das lösen, indem du diese WHERE bedingung mit in die LEFT JOIN Klausel mit rein nimmst.

    Ilja