Entwickler-Ecke
Datenbanken - Hilfe bei einer SQL Abfrage
OliverN_26 - So 16.10.11 14:42
Titel: Hilfe bei einer SQL Abfrage
Hallo
Ich habe folgenden SELECT mit dem ich mir alle Postleitzahlen hole, die einem entsprechenden Team zugeordnet sind:
Quelltext
1: 2: 3: 4: 5: 6:
| SELECT team_plz FROM sk_teams INNER JOIN sk_mitarbeiter ON sk_mitarbeiter.team_id = sk_teams.team where team = '1' order by team_plz group by team_plz |
Ergebnis ist z.B. '10005' / '10006' / '10007' / '10008'
Ok .. nun will ich aber Daten zu den obigen Postleitzahlen aus einer anderen Tabelle holen:
Quelltext
1: 2: 3: 4:
| SELECT kd_plz, kd_vorname, kd_nachname FROM sk_kundenstamm AS A INNER JOIN sk_teams AS B ON B.team_plz = A.kd_plz WHERE MATCH (team_plz) AGAINST ('10005 10006 10007 10008' IN BOOLEAN MODE) |
1. Frage: Wie schreibe ich es, dass die Werte beim "MATCH"-Teil automatisch da stehen? Ich weiß ja nicht, welche Postleitzahlen kommen .. also kann ich sie auch nicht einfach hinschreiben
2. Frage (die wohl meine 1.Frage lösen wird): wie kann ich die beiden SELECt's miteinander verbinden? Das muß doch machbar sein, oder?! Quasi ein SELECT im SELECT mit den Ausgabewerten.
Danke
bummi - So 16.10.11 16:32
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| SELECT kd_plz, kd_vorname, kd_nachname FROM sk_kundenstamm where kd_plz in ( SELECT team_plz FROM sk_teams INNER JOIN sk_mitarbeiter ON sk_mitarbeiter.team_id = sk_teams.team where team = '1' group by team_plz ) |
OliverN_26 - So 16.10.11 16:39
Mein Beispiel war etwas zu einfach, da mehrere Tabellen involviert sind. Ich habs jetzt folgendermaßen gelöst:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| SELECT wonr_intern, wo_typ, tzeit, kd_nachname, kd_strasse, kd_hsnr, kd_plz, kd_ort, anlnr, wartung FROM sk_auftraege AS A LEFT OUTER JOIN sk_kundenstamm AS B ON A.kdnr_intern=B.kdnr_intern LEFT OUTER JOIN sk_teams AS C ON B.kd_plz=C.team_plz LEFT OUTER JOIN tevents AS D ON A.wonr_intern=D.event_name LEFT OUTER JOIN sk_terminzeit AS E ON D.termin=E.id WHERE wo_stat = '0' AND C.team LIKE '$_POST[team]' UNION SELECT wonr_intern, wo_typ, tzeit, kd_nachname, kd_strasse, kd_hsnr, kd_plz, kd_ort, anlnr, wartung FROM sk_auftraege AS A RIGHT OUTER JOIN sk_kundenstamm AS B ON A.kdnr_intern=B.kdnr_intern RIGHT OUTER JOIN sk_teams AS C ON B.kd_plz=C.team_plz RIGHT OUTER JOIN tevents AS D ON A.wonr_intern=D.event_name RIGHT OUTER JOIN sk_terminzeit AS E ON D.termin=E.id WHERE wo_stat = '0' AND C.team LIKE '$_POST[team]' ORDER BY wonr_intern |
Ist an meiner Variante was falsch? Die Postleitzahlen sind Teams zugeordnet. Ich such mir jetzt also die Postleitzahlen, die zu dem Team passen, welches ich als Parameter mitgebe.
bummi - So 16.10.11 22:12
Ich tue mir schwer ohne die Daten zu kennen Deinen SQL's zu folgen, was mit auffällt
WHERE wo_stat = '0' AND C.team LIKE '$_POST[team]'
ich weiß nicht wo wo_stat enthalten ist, aber C.team in einer Where-Bedingung bei Left Join C kann nicht das sein was Du wirklich meinst...
Right Outer Joins verwende ich niemals, generierte SQL's formuliere ich um, da ich Right Outer's für extrem schlecht lesbar halte, auch verstehe ich den Sinn nicht per Union ein und dieselbe Abfrage mit LEFT/RIGHT zweimal zu verwenden.
OliverN_26 - So 16.10.11 23:08
Wenn du dir wirklich einen Überblick verschaffen willst, habe ich die wichtigen Tabellen als .jpg angehängt und die involvierten Datenfelder markiert. Ich bin für jeden Tip dankbar.
Ich musste noch mal was ändern. Der aktuelle Stand sieht so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| SELECT wonr_intern, wo_typ, tzeit, kd_nachname, kd_strasse, kd_hsnr, kd_plz, kd_ort, anlnr, wartung FROM sk_auftraege AS A LEFT OUTER JOIN sk_kundenstamm AS B ON A.kdnr_intern=B.kdnr_intern LEFT OUTER JOIN sk_teams AS C ON B.kd_plz=C.team_plz LEFT OUTER JOIN sk_gruppen AS D ON C.team=D.gebiet LEFT OUTER JOIN tevents AS E ON A.wonr_intern=E.event_name LEFT OUTER JOIN sk_terminzeit AS F ON E.termin=F.id WHERE wo_stat = '0' AND D.gruppe LIKE '$_POST[gruppe]' UNION SELECT wonr_intern, wo_typ, tzeit, kd_nachname, kd_strasse, kd_hsnr, kd_plz, kd_ort, anlnr, wartung FROM sk_auftraege AS A RIGHT OUTER JOIN sk_kundenstamm AS B ON A.kdnr_intern=B.kdnr_intern RIGHT OUTER JOIN sk_teams AS C ON B.kd_plz=C.team_plz RIGHT OUTER JOIN sk_gruppen AS D ON C.team=D.gebiet RIGHT OUTER JOIN tevents AS E ON A.wonr_intern=E.event_name RIGHT OUTER JOIN sk_terminzeit AS F ON E.termin=F.id WHERE wo_stat = '0' AND D.gruppe LIKE '$_POST[gruppe]' ORDER BY wonr_intern |
wo_stat = wird von einem Programm aus befüllt (ist ok so)
$_POST[gruppe] ist ein Parameter der von einem AJAX-Formular mitgegeben wird und an dieser Stelle abgefragt werden muß
Ich habe mich kürzlich in das Thema rein gelesen. LEFT OUTER/RIGHT OUTER wird da so als Syntax in Bezug auf einen MySQL UNION Select beschrieben ?!
Sagen wir mal so .. ich bekomme all die Daten so, wie ich sie haben will. Kann es dann falsch sein? Oder gibt es da Performance-Verbesserungen?
Bin für jeden Tip und Verbesserungsvorschlag dankbar.
Danke vorab
bummi - So 16.10.11 23:22
Ich steige immer noch nicht ganz durch, aber ich denke Aufträge auf Kunde sind ein direkter Join (kein LEFT/RIGHT)
bei der Bedingung für Gruppen und Teams scheint es ebenso zu sein, sonst könntest Du kein Where verwenden sondern müsstest im ON des Joins einschränken, bleiben die Events und Termine die gegf. per Left nachgeschlagen werden könnten...
aber wie gesagt, ich kenne weder Fremdschlüssel, Einschränkungen noch die genaue Zielsetzung, ich denke nur der einfachste SQL wird die grösste Nachvollziehbarkeit/Wartbarkeit nach sich ziehen ...
BTW. MySQL und Firebird kenne ich kaum und meide sie wo möglich ....
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!