Problem mit JOIN-Kommando
Kalle
- datenbank
Hallo, aktive Forumler,
jetzt teste ich schon eine Stunde und komm nicht drauf.
Habe zwei Tabellen, beide haben ein Feld namens "nr"
Mit dem folgenden SQL-Kommando wird die Menge der Datensätze korrekt ausgelesen. Ich benötige pro Datensatz das Feld "termine.nr".
Mit $row['nr'] erhalte ich "akt_orte.nr" OK, ist ja auch ungenau ausgedrückt.
Aber mit "$row['termine.nr']" ist die Antwort NICHTS.
Auch der Versuch "SELECT termine.nr as termine_nr, * FROM ..." schlug fehl. Wie zum Teufel komme ich an "termine.nr" ?
SELECT * FROM termine INNER JOIN akt_orte ON ( akt_orte.breitengrad <= '49.7200401' AND akt_orte.breitengrad >= '49.5400601' AND akt_orte.laengengrad <= '8.45234' AND akt_orte.laengengrad >= '8.27236' AND termine.ort_nr = akt_orte.nr AND termine.loe_kz = 0 AND termine.intern_kz = 0 AND termine.tag >= '2003-01-10' AND termine.tag <= '2003-02-09' ) ORDER BY termine.tag, termine.uhr, termine.nr
Lieben Gruß aus Worms, Kalle.
Hallo Kalle,
Habe zwei Tabellen, beide haben ein Feld namens "nr"
d.h. der JOIN (die Verbindung) erfolgt über dieses Feld :-)
...
Auch der Versuch "SELECT termine.nr as termine_nr, * FROM ..." schlug fehl. Wie zum Teufel komme ich an "termine.nr" ?
...
SELECT * FROM termine INNER JOIN akt_orte ON ( akt_orte.breitengrad <= '49.7200401' AND akt_orte.breitengrad >= '49.5400601' AND akt_orte.laengengrad <= '8.45234' AND akt_orte.laengengrad >= '8.27236' AND termine.ort_nr = akt_orte.nr AND termine.loe_kz = 0 AND termine.intern_kz = 0 AND termine.tag >= '2003-01-10' AND termine.tag <= '2003-02-09' ) ORDER BY termine.tag, termine.uhr, termine.nr
Das was Du in der JOIN-Klausel stehen hast, ist eine Einschränkung Deiner Datensätze, die gehört normalerweise in die WHERE-Klausel:
SELECT * FROM termine
INNER JOIN akt_orte ON termine.nr = akt_orte.nr
WHERE ( akt_orte.breitengrad <= '49.7200401' AND akt_orte.breitengrad >= '49.5400601' AND akt_orte.laengengrad <= '8.45234' AND akt_orte.laengengrad >= '8.27236' AND termine.ort_nr = akt_orte.nr AND termine.loe_kz = 0 AND termine.intern_kz = 0 AND termine.tag >= '2003-01-10' AND termine.tag <= '2003-02-09' )
ORDER BY termine.tag, termine.uhr, termine.nr
Kurze Frage noch: Wie kommst Du überhaupt an akt_orte.nr. Dieses Feld ist in Deiner Abfrage nirgendwo vorhanden
Gruss,
Vinzenz
Hallo Vinzenz,
danke für deine Antwort, untersuche ich morgen.
Kurze Frage noch: Wie kommst Du überhaupt an akt_orte.nr. Dieses Feld ist in Deiner Abfrage nirgendwo vorhanden
ich denke, das ist in SELECT * vorhanden ?
Gruß, Kalle
Sorry Vinzenz,
Kurze Frage noch: Wie kommst Du überhaupt an akt_orte.nr. Dieses Feld ist in Deiner Abfrage nirgendwo vorhanden
Ich habe nicht "akt_orte.nr" aufgerufen, sondern "nr". Aber die Variable hatte den Wert von "akt_orte.nr".
Gruß, Kalle
Hallo Kalle,
Ich habe nicht "akt_orte.nr" aufgerufen, sondern "nr". Aber die Variable hatte den Wert von "akt_orte.nr".
Hm, die Werte von akt_orte.nr sollten auch in termine.nr vorkommen, was Du wirklich bekommst sind die nr aus termine:
SELECT * FROM termine
...
bedeutet: Wähle alle Spalten aus der Tabelle termine
Willst Du alle Spalten beider Tabellen haben, musst Du das so formulieren:
SELECT termine.*, akt_orte.* FROM termine
INNER JOIN akt_orte ON termine.nr = akt_orte.nr
...
Gruss,
Vinzenz
Hallo, Vinzenz,
leider ist bei mir der AHA-Effekt ausgeblieben, ich habe das Konzept des JOIN überhaupt nicht verstanden. Komme von ORACLE und da verbinde ich Tabellen in der Form
SELECT * from termine
WHERE termine.ort_nr IN
( select nr from akt_orte
where breitengrad <= '49.789' ...
)
AND termine.tag >= '2003-01-10'
ORDER BY ...
So hatte ich es auch mal für MySQL programmiert, also erst eine programminterne Tabelle mit den infrage kommenden Ortsnummern gefüllt und in einer ZWEITEN Abfrage damit die Termin-Tabelle durchsucht.
Kann ich wieder so machen, aber ich dachte, es geht schneller.
Ich probiere noch mal, die beiden Tabellen mit getrenntem WHERE zu selektieren und dazwischen das JOIN zu setzen, mal sehen ...
Gruß aus Worms, Kalle.
Hallo Kalle,
leider ist bei mir der AHA-Effekt ausgeblieben, ich habe das Konzept des JOIN überhaupt nicht verstanden. Komme von ORACLE und da verbinde ich Tabellen in der Form
Vielleicht jetzt was für den Aha-Effekt :-(
SELECT * from termine
WHERE termine.ort_nr IN
( select nr from akt_orte
where breitengrad <= '49.789' ...
)
AND termine.tag >= '2003-01-10'
ORDER BY ...
Das ist ein Subselect, und das wird von MySQL, zumindest Version 3.23.xx nicht unterstützt.
Ist eines der am meisten gewünschten Features, auch von mir ;-)
Gruss,
Vinzenz
Moin!
Auch der Versuch "SELECT termine.nr as termine_nr, * FROM ..." schlug fehl. Wie zum Teufel komme ich an "termine.nr" ?
SELECT * FROM termine INNER JOIN akt_orte ON ( akt_orte.breitengrad <= '49.7200401' AND akt_orte.breitengrad >= '49.5400601' AND akt_orte.laengengrad <= '8.45234' AND akt_orte.laengengrad >= '8.27236' AND termine.ort_nr = akt_orte.nr AND termine.loe_kz = 0 AND termine.intern_kz = 0 AND termine.tag >= '2003-01-10' AND termine.tag <= '2003-02-09' ) ORDER BY termine.tag, termine.uhr, termine.nr
SELECT * ist schon mal ganz schlecht. Benenne eindeutig die von dir gewünschten Spalten in den beiden Tabellen, und alles wird besser. Dann kannst du obendrein auch (was jetzt noch nicht funktionierte) Alias-Namen zuordnen und so die Spalten eindeutig abfragen.
Was sonst noch zu sagen wäre:
1. Die JOIN-Bedingung im "ON ..." zu bringen ist vollkommen in Ordnung. MySQL optimiert das zwar ins "WHERE" hinein, weil es für MySQL so offenbar schneller geht, aber andere RDBMS können unter Umständen durchaus davon profitieren, dass die Verknüpfungsbedingung im "ON" genannt wird.
2. Ein Subselect, wie du ihn bei Oracle kennst, ist nicht 100% vergleichbar mit einem JOIN. Sonst würde ja niemand jammern, dass MySQL Subselects (jedenfalls in Version 3) nicht kann. Subselects sind offenbar für was anderes da, als JOINs. Also bitte nicht verwechseln. Und außerdem bin ich mir 100% sicher, dass auch Oracle JOINs kann - nur vermutlich mit einer anderen Syntax.
3. Zum Testen deiner SQL-Kommandos ist es sehr empfehlenswert, wenn du irgendeine SQL-Administrationsoberfläche zur Verfügung hättest. Idealerweise installierst du PhpMyAdmin, damit hast du eine wirklich gute Umgebung, um Datenbankprobleme und Datenbankabfragen in den Griff zu kriegen. Für dein Problem sicherlich sehr hilfreich ist, dass PhpMyAdmin (aber wohl auch jede andere Admin-Oberfläche) dir direkt anzeigt, welche _Spalten_ du als Ergebnis kriegst. Das Rumraten, wie die Spalten denn nun wohl heissen mögen, entfällt. Außerdem meine ich mich in diesem Zusammenhang daran zu erinnern, dass gleichlautende Spalten zweier Tabellen dann nicht als zwei Spalten zurückgegeben werden, wenn du ihnen _keinen_ Aliasnamen gibst. Schon allein deswegen ist SELECT * schlecht.
- Sven Rautenberg