Rafael: Verknüpfte Tabelle

Ich grüble gerade, ob ich eine Abfrage unnötig verkompliziere.

Ich habe eine Tabelle mit Adressdaten und eine mit Außendienstmitarbeitern, die diese Tabelle einsehen dürfen.

Nun frage ich also ab:

"SELECT A.* FROM adressen AS A
INNER JOIN außendienst AS B ON A.ID = B.ID
WHERE B.mitarbeiter = '".$_SESSION['user']."';"

So in etwa mal aus dem Ärmel.

Nun frage ich mich: für den Fall, dass bei einer Tabelle mehrere Sätze mit B.ID = A.ID existieren, ob dann ein beliebiger ausgewählt wird.
Jetzt dachte ich noch an:

"SELECT A.* FROM adressen AS A
INNER JOIN außendienst AS B ON A.ID = B.ID AND B.mitarbeiter = '".$_SESSION['user']."';"

Also ohne WHERE Bedigung.
Aber brauche ich dann überhaupt den INNER JOIN?
Irgendwie glaube ich, dass ginge einfacher...

Danke für Tipps!

  1. yo,

    Nun frage ich mich: für den Fall, dass bei einer Tabelle mehrere Sätze mit B.ID = A.ID existieren, ob dann ein beliebiger ausgewählt wird.
    Jetzt dachte ich noch an:

    "SELECT A.* FROM adressen AS A
    INNER JOIN außendienst AS B ON A.ID = B.ID AND B.mitarbeiter = '".$_SESSION['user']."';"

    Also ohne WHERE Bedigung.

    diese abfrage ist letzlich genau die gleiche wie die erste, nur eine andere schreibweise. dein datenbank-design gibt es her, dass ein außendienstmitarbeiter duchaus mehrere adressen haben kann (oder umgekehrt, bin mir da nicht ganz sicher auf jeden fall 1:n), wobei mir die JOIN bedinung mekrwürdig vorkommt, da beide spalten id heißen. die eine der beiden sollte ein fremdschlüssel sein und kein PK.

    ob du nun nur eine adresse anzeigst oder alle, das ist letzlich eine fachliche frage. schließlich kann man ja nicht einfach so adressen unter dem tisch fallen lassen. und wenn nur eine, dann nach welchen kriterium entschieden wird, bzw. eine adresse kann mehrere außendienstmitarbeiter haben.

    noch ein hinweis. es muss der fall abgeklärt werden, ob jeder außendienstmitarbeiter immer mindestens eine adresse hat. ansonsten wäre ein OUTER JOIN der bessere weg.

    Ilja

    1. Hey,
      okay entweder ich hab dich falsch verstanden oder ich hab mich unklar ausgedrückt.
      Es gibt Adressdatensätze, die mit einer anderen Tabelle verknüpft sind, die einen Fremdschlüssel besitzen. Nun möchte ich alle Datensätze abfragen, die einen Fremdschlüssel besitzen und deren Fremdschlüssel einen Wert besitzen, der dem Namen des Außendienstmitarbeiters entspricht.

      Also die Tabellen wären dann:

      Adressen
      -----------------
      1233 | x | x | x

      Außendienst
      -----------------
      Nu | ID | Name
      -----------------
      34 | 1233 | Meier
      35 | 1233 | Müller

      Nun will ich, dass Meier und Müller diesen Datensatz 1233 angezeigt bekommen. Heinrich dagegen nicht.

      Bin ich also auf dem richtigen Weg? Kann bei der ersten Methode über den INNER JOIN nicht ein Datensatz untergehen, wenn einfachn mit Meier verbunden wird?
      Bin grad n bisschen konfus...

      1. Bin grad n bisschen konfus...

        Du hast Addressen und Mitarbeiter, die diese Adressen betreuen. Dazu folgendes:
        1.) statt Adressen wollen wir das Objekt beim Namen nennen, sind es vielleicht Kunden?
        2.) Verschiedene Mitarbeiter können verschiedene Kunden betreuen, d.h. es gibt keine Einschränkungen, wie bspw. dass ein Kunde nur von einem MA verköstigt werden kann oder soll?
        3.) Ein MA versorgt mehrere Kunden?

        Falls Frage 2 und 3 mit "Ja" beantwortet, dann komm besser mit den drei Tabellen:

        Kunden
        --
        ID | Name | Adresse | etc

        Mitarbeiter
        --
        ID | Name | etc

        Kunden_Mitarbeiter
        --
        ID | Kunden_ID | Mitarbeiter_ID             -- kein etc.   ;)

        na, ja, und dann kannst Du alles fröhlich abfragen.

        1. Das Problem ist, dass die Tabellen gegeben sind. Ich muss den ganzen Quatsch aus einer Access-Datenbank exportieren und mir ist nicht so die Handhabe gegeben. Die Namen sind allerdings eindeutig.

          Ich werde es aber einfach aus einem Inner Join machen und eine doppelte ON-Bedingung setzen, dass klappt ganz gut.

          Was liefert die Abfrage eigentlich zurück wenn es keinen passenden JOIN-Satz gibt? Null oder?

          1. Ich werde es aber einfach aus einem Inner Join machen und eine doppelte ON-Bedingung setzen, dass klappt ganz gut.

            Wenn Du noch eine weitere Bedingung hast, bspw. die ID des in eingeloggten MAs, dann ist das natürlich gut und Dein "Problem" verschwindet.

            Was liefert die Abfrage eigentlich zurück wenn es keinen passenden JOIN-Satz gibt? Null oder?

            NULL ist für Datenfelder, elementlose Datensatzmengen sind leer.   ;)

            1. Okay, klappt so ganz gut. Danke!

      2. yo,

        Es gibt Adressdatensätze, die mit einer anderen Tabelle verknüpft sind, die einen Fremdschlüssel besitzen.

        damit wäre schon mal geklärt, dass eine Adresse mehrere Außendienstmitarbeiter haben kann. das war deswegen unklar, weil der FK in der tabelle Außendienst ID heißt. das ist ein schlechter bezeichner für einen FK, da ich damit eher einen PK verbinde.

        Nun möchte ich alle Datensätze abfragen, die einen Fremdschlüssel besitzen und deren Fremdschlüssel einen Wert besitzen, der dem Namen des Außendienstmitarbeiters entspricht.

        das geht schon über den join. allerdings ist der weg über den name in dern außendienst tabelle nicht gut, es sei den jeder name kommt nur ein mal in der tablle vor, sprich ist UNIQUE. sobald es aber zwei mitarbeiter mit dem gleichen namen gibt, sehe sie ihre adressen gegenseitig.

        Ilja

  2. Nun frage ich mich: für den Fall, dass bei einer Tabelle mehrere Sätze mit B.ID = A.ID existieren, ob dann ein beliebiger ausgewählt wird.

    Wenn ein Kunde von mehreren MAs beteurt werden kann, dann kriegst Du natürlich unter Umständen mehrere MAs angezeigt. Das muss ja so sein, wenn Du zufällig einen haben willst dann komm mit "ORDER BY RANDOM()" (oder so ähnlich, siehe Doku). Wenn Du nur einen haben willst komm mit "LIMIT 0, 1".