Götz: (MySQL) Problem bei Abfrage über mehrere Tabellen (Klaus)

Hallo Klaus,

der ursprüngliche Thread scheint verschwunden, deswegen antworte ich auf Deine Frage einfach mit einem neuen Thread.

select a.*,b.vorname as erf_vorname,b.name as erf_name,c.vorname as b_vorname,c.name as b_name from haupttabelle as a left join personen as b on a.erfasser = b.personalnummer left join personen as c on a.bearbeiter = c.personalnummer

Wie kann ich die Abfrage dahingehend abändern, dass nur der erste gefundene genommen wird oder die Suche erst gar nicht durchgeführt wird, wenn Bearbeiter noch Null enthält?

Laut MySQL Manual kann nach ON eine "conditional expression" stehen. Somit sollte es möglich sein den letzten Teil "left join personen as c on a.bearbeiter = c.personalnummer" zu erweitern, und "c.personalnummer IS NOT NULL" mit in die Join-Bedingung aufzunehmen.
Ich bin mir allerdings gerade nicht ganz sicher, ob das wirklich das ist, was Du willst.

Grüße aus Stockholm,
Götz

--
Losung für Mittwoch, 16. April 2008
Der HERR ist mein Licht und mein Heil; vor wem sollte ich mich fürchten? (Psalm 27,1)
Ihr seid teuer erkauft; werdet nicht der Menschen Knechte. (1.Korinther 7,23)
(zur aktuellen Losung)
  1. Hallo Klaus,

    Die Abfrage funktioniert prima, wenn immer ein Erfasser und auch ein Bearbeiter angegeben sind.
    Leider trifft das auf letzteres nicht immer zu und im Feld Bearbeiter steht (noch) eine Null.

    steht da die Zahl 0 oder der spezielle Wert NULL?

    Da in der Personen-Tabelle leider auch zahlreiche Einträge ohne Personalnummer geführt werden, werden nun alle diese Einträge aufgelistet.

    Wie kann ich die Abfrage dahingehend abändern, dass nur der erste gefundene genommen wird oder die Suche erst gar nicht durchgeführt wird, wenn Bearbeiter noch Null enthält?

    Das hört sich danach an, als stände da die Zahl 0, wahrscheinlich der Standardwert für diese Spalten. Wenn dies so ist, dann sollte es folgende Vorgehensweise tun:

    Lege ein Backup der Datenbank an.
    Lasse in diesen Spalten NULL-Werte zu.
    Ändere alle Einträge in diesen Spalten, die den Wert 0 haben zu NULL ab.

    Der Vergleich von NULL = NULL liefert nicht TRUE sondern NULL zurück, deswegen sollten danach Deine LEFT JOINs das gewünschte Resultat liefern.

    Gibt es jedoch (selten dämliche) Anwendungen, die sich darauf verlassen, dass da eine Zahl drin steht, dann darfst Du so nicht vorgehen, in diesem Fall könntest Du Deine Abfrage dahingehend modifizieren, dass Du 0 speziell berücksichtigst.

    Freundliche Grüße

    Vinzenz

  2. Hallo Klaus,

    versuch mal anstatt "LEFT JOIN" ein "INNER JOIN" zu benutzen.

    Viele Grüße

  3. Hallo zusammen,

    es ist wohl hilfreich, wenn ich einfach das Ausgangsposting nochmal poste, nur daran hatte ich vorher garnicht sofort gedacht:
    <originalthread>
    Hallo,

    ich habe ein Problem mit einer Abfrage, die über mehrere Tabellen geht.

    In einer Haupttabelle stehen neben sonstigen Informationen der Erfasser und auch der Bearbeiter. Beide mit Ihrer Personalnummer.
    In einer Personalstamm-Tabelle stehen dann die dazugehörigen Namen, Abteilung etc.
    Nun möchte ich mir alle Einträge der Haupttabelle anzeigen lassen und natürlich die Namen der Erfasser und Bearbeiter.

    Hierfür hab ich dann folgende Abfrage versucht:

    select a.*,b.vorname as erf_vorname,b.name as erf_name,c.vorname as b_vorname,c.name as b_name from haupttabelle as a left join personen as b on a.erfasser = b.personalnummer left join personen as c on a.bearbeiter = c.personalnummer

    Die Abfrage funktioniert prima, wenn immer ein Erfasser und auch ein Bearbeiter angegeben sind.
    Leider trifft das auf letzteres nicht immer zu und im Feld Bearbeiter steht (noch) eine Null.
    Da in der Personen-Tabelle leider auch zahlreiche Einträge ohne Personalnummer geführt werden, werden nun alle diese Einträge aufgelistet.

    Wie kann ich die Abfrage dahingehend abändern, dass nur der erste gefundene genommen wird oder die Suche erst gar nicht durchgeführt wird, wenn Bearbeiter noch Null enthält?

    Danke und Gruß,

    Euer Klaus.
    </originalthread>

    Viele Grüße,
    Götz

  4. Hallo Götz,

    ich hab es dann durch probieren (da das Forum nicht erreichbar war) die von Dir genannte Lösung verwendet. Zumindest hab ich diese so verstanden:

    select a.*,b.vorname as erf_vorname,b.name as erf_name,c.vorname as b_vorname,c.name as b_name from haupttabelle as a left join personen as b on a.erfasser = b.personalnummer left join personen as c on a.bearbeiter = c.personalnummer AND c.pesonalnummer > 0

    Damit erhalte ich dann NULL-Werte für die b_vorname und b_name und nur einen Satz.

    Die Tabellen-Felder anzupassen und NULL-Werte zu erlauben, wäre sicherlich auch eine Lösung, aber die gewachsenen Strukturen würden da den Rahmen sprengen.

    Danke allen, die mir helfen wollten und konnten.

    Gruß,

    Klaus