Weihnachtsmann (Martin): Problem mit WHERE bzw. JOIN Syntax

Hallo,
Ich habe 3 Tabellen:

Tabelle Orte mit folgenden Feldern:
ao_id
ao_v_id
ao_kurzname
ao_name
ao_text

Tabelle Regionen mit folgenden Feldern
ar_id
ar_name
ar_beschreibung

Ort2Regionen
aa_id
aa_ao_id
aa_ar_id

Die Tabelle Orte ist leer und die Tabelle Regionen ist ebnfalls leer.
Wie zu sehen ist, soll die Tabelle Ort2Regionen die beiden Tabellen Region und Orte miteinander verknüpfen.
Nun will ich im ersten Schritt Abfragen welchen  Orte keiner Region zugeordnet sind, umd anschießend, die Möglichkeit zu bauen die Orte einer Region zuzuuordnen: Das probiere ich mit folgendem Statement:
$sql="SELECT ao_name FROM orte, orte2regionen WHERE ao_id!=aa_ao_id";
Fehlermeldung kommt keine, die Syntax ist in Ordnung. Ich habe probehalber ne falsche Syntax übergeben. Die Fehlerprüfung funktioniert also. Wenn ich nur die Orte abfrage ist auch alles o.k..
Welches Weihanchtsbier liegt mir da im Augenblick noch quer, dass ich ein solch einfaches Statement nicht hinkriege?
Martin

  1. Korrektur:
    Muß heißen:

    Die Tabelle orte2regionen ist leer und die Tabelle Regionen ist ebnfalls leer.

    In der Tabelle Orte ist was drin!
    Angezeigt wird nichts, als ob die Ergebnis menge leer ist.
    Es sollte aber alle Orte in der Tabelle orte angezeigt werden.

    Martin

    1. Hallo,

      Die Tabelle orte2regionen ist leer und die Tabelle Regionen ist ebnfalls leer.
      In der Tabelle Orte ist was drin!
      Angezeigt wird nichts, als ob die Ergebnis menge leer ist.

      Ja, ist sie bei
      SELECT ao_name FROM orte, orte2regionen WHERE ao_id!=aa_ao_id
      auch.
      Wenn orte2regionen keine Datensätze enthält, kann auch keine JOIN-Datenmenge erzeugt werden.

      Es sollte aber alle Orte in der Tabelle orte angezeigt werden.

      Dann brauchst Du einen Outer-Join. Hier wohl einen LEFT JOIN.
      Allerdings:
      Welchen Sinn soll die Verbindung zu orte2regionen über die Bedingung ao_id!=aa_ao_id haben. Will sagen, was erwartest Du als Ergebnismenge, wenn orte2regionen Datensätze enthält?

      viele Grüße

      Axel

  2. echo $begrüßung;

    Ich habe 3 Tabellen:

    Tabelle Orte mit folgenden Feldern:
    Tabelle Regionen mit folgenden Feldern
    Ort2Regionen

    Mit der letzten Tabelle kannst du eine m:n-Beziehung zwischen Orten und Regionen aufbauen. Damit kann man abbilden, dass Regionen mehrere Orte haben können und dass Orte sich in mehreren Regionen befinden können. Wird letzteres wirklich benötigt? Wenn nicht reicht ein Feld mir der Regions-ID in der Tabelle Orte.

    Nun will ich im ersten Schritt Abfragen welchen  Orte keiner Region zugeordnet sind [...]
    $sql="SELECT ao_name FROM orte, orte2regionen WHERE ao_id!=aa_ao_id";

    Du solltest dich zuerst um eine ordentliche Verknüpfung bemühen. Das Ein- oder Ausschluss-Kriterium kommt im zweiten Schritt hinzu.
    Verknüpfungen kann man in der WHERE-Klausel herstellen, übersichtlicher scheint mir jedoch die JOIN-Syntax

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

    Wenn du die Datensätze haben möchtest, die nur in ener Tabelle vorkommen, dann benötigst du einen LEFT JOIN, damit auch die Datensätzt zum Ergebnis gehören, die kein Pendant in der anderen Tabelle haben und als Bedingung prüfst du, ob ein Feld der anderen Tabelle NULL ist (IS NULL) welches garantiert einen Wert enthalten müsste (die Primarschlüsselspalte bietet sich hier an).

    echo "$verabschiedung $name";

  3. yo,

    $sql="SELECT ao_name FROM orte, orte2regionen WHERE ao_id!=aa_ao_id";

    SELECT ao_name FROM orte
    LEFT JOIN orte2regionen ON (ao_id=aa_ao_id)
    WHERE aa_ao_id IS NULL

    Ilja