IF in SQL
Jan
- datenbank
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
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
Hi,
GOLFCLUBS: vereinsname1 (adid)
ADRESSEN: strasse, strasse2, plz, ort, land (adid)
MITARBEITER: bereich, position (pid)
PERSONEN: vorname, nachname, geschlecht, titel, anredeIch 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
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
Hi,
GOLFCLUBS: vereinsname1, adid
ADRESSEN: strasse, strasse2, plz, ort, land, adid
MITARBEITER: bereich, position, pid
PERSONEN: vorname, nachname, geschlecht, titel, anrede, pid, adidOK. 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
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
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
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
GOLFCLUBS: vereinsname1 (adid)
ADRESSEN: strasse, strasse2, plz, ort, land (adid)
MITARBEITER: bereich, position (pid)
PERSONEN: vorname, nachname, geschlecht, titel, anredeIch 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.
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";
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