franz: Probleme mit LEFT JOIN (mySQL)

Servus!

kriege eine bestimmte LEFT JOIN Anweisung einfach nicht hin.

habe die Tabelle Gewerk:

gewerk_id   int(11)  Nein
gewerk_name   varchar(255) Nein
gewerk_meister   int(11)  Nein  0
gewerk_vertreter   int(11)  Nein  0
gewerk_angelegt   date Nein  0000-00-00
gewerk_ersteller   int(11)  Nein  0

Wie ihr seht gibt es pro Gewerk(Abteilung) einen Meister und einen Vertreter.

In den Spalten gewerk_meister und  gewerk_vertreter sind allerdings nicht die Namen gespeichert sondern deren Personalnummer. Welche auf

Wenn ich nun die Tabelle Gewerk ausgeben lassen will, erhalte ich mit einem normalen SELECT * FROM gewerk aller Felder, allerdings mit Personalnummer der Meister und Vertreter - wie schaffe ich es, dass dort die Nachnamen, Vornamen stehen?

Mit folgendem Statement, erhalte ich zwar Werte allerdings nicht die die gewünscht sind:

-------------------------------------------------------------------

SELECT gewerk.gewerk_name, gewerk.gewerk_vertreter, personal.mit_nachname
FROM gewerk
LEFT JOIN personal
ON(gewerk_meister = personalnummer  OR gewerk_vertreter = personalnummer) GROUP BY personal.mit_nachname

--------------------------------------------------------------------

ergebnis:

+-------------+------------------+--------------+
| gewerk_name | gewerk_vertreter | mit_nachname |
+-------------+------------------+--------------+
| Einkauf     |           119163 |       [NULL] |
| Vertrieb    |           116279 |       Müller |
| Werkstatt   |           109621 |         Hans |
| Produktion  |           109621 |        Franz |
+-------------+------------------+--------------+

Es stimmt zwar, dass Müller und Franz Vertreter sind, aber Hans ist Meister - taucht aber auch auf.

Danke für eure Hilfe!

gruß Franz

  1. Es stimmt zwar, dass Müller und Franz Vertreter sind, aber Hans ist Meister - taucht aber auch auf.

    klar, willst du laut sql-befehl ja auch nicht anders (im join sind zwei mit or verknüpfte bedingungen - die eine für die meister die andere für die vertreter)

    wozu eigentlich die group-by-klausel?

  2. Hallo franz!

    Wenn ich nun die Tabelle Gewerk ausgeben lassen will, erhalte ich mit einem normalen SELECT * FROM gewerk aller
    Felder, allerdings mit Personalnummer der Meister und Vertreter - wie schaffe ich es, dass dort
    die Nachnamen, Vornamen stehen?

    SELECT gewerk.gewerk_name,
              gewerk.gewerk_vertreter,
              personal.mit_nachname
         FROM gewerk
    LEFT JOIN personal
              ON (gewerk_meister = personalnummer  OR gewerk_vertreter = personalnummer)
    GROUP BY personal.mit_nachname
    ergebnis:

    Ungestest und ohne Gewähr auf Richtigkeit:

    Vorschlag A:

    SELECT gewerk.gewerk_name,
               gewerk.gewerk_meister,
               a.mit_nachname AS 'Meister_Nachname',
               gewerk.gewerk_vertreter,
               b.mit_nachname AS 'Vertreter_Nachname'
          FROM gewerk
     LEFT JOIN personal AS a ON gewerk.gewerk_meister = a.personalnummer,
               personal AS b ON gewerk_vertreter = b.personalnummer)
      GROUP BY personal.mit_nachname

    Vorschlag B:

    SELECT gewerk.gewerk_name,
               gewerk.gewerk_vertreter,
               personal.mit_nachname
          FROM gewerk
     LEFT JOIN personal ON gewerk_vertreter = personal.personalnummer
      GROUP BY personal.mit_nachname

    Es stimmt zwar, dass Müller und Franz Vertreter sind, aber Hans ist Meister - taucht aber auch auf.

    Was willst du eigentlich nun? Zu jedem Wert der Spalte gewerk.gewerk_meister und gewerk.gewerk_vertreter jeweils die passenden Nachnamen aus der Tabelle personal verknüpft mit der Spalte personal.personalnummer? Bzw. die Nachnamen von Meister und Vertreter oder nur die der Vertreter deren Personalnummern in der Tabelle gewerk stehen?

    Grüsse,

    Sky