Vinzenz Mai: Mysql left join problem

Beitrag lesen

Hallo

wenn ich das group by weglasse bekomme ich viel zu viele Ergebniszeilen...

Nein, wieso? Kann ein Clan mehrfach in der gleichen Liga sein? Wohl kaum.

und mit der Where-Klausel muss ich ja irgendwie eingrenzen bzw irgendwo muss ja erwähnt werden, dass es sich um einen bestimmte Clan handelt...

Ja, nur nicht in der WHERE-Klausel, sondern in der Join-Bedingung.

der Wert isregistered soll einfach nur anzeigen, ob ein Clan registriert ist oder nicht... also 0 oder 1

eben deswegen benötigst Du COALESCE ...

Ein kleines Beispiel:

Tabelle gremien:

id | bezeichnung
----------------
 1 | Spiel
 2 | SR
 3 | Jugend
 4 | Ausbildung

Tabelle mitglieder

id | id_gremium | id_person
-----------------------------
 1 |          1 | 10
 2 |          1 |  7
 3 |          1 | 15
 4 |          2 |  1
 5 |          2 |  8
 6 |          3 | 10
 7 |          3 |  5
 8 |          4 | 11
 9 |          4 |  7

Du möchtest nun alle Gremien anzeigen - und ob die Person mit der id 10 diesem Gremium angehört.

  
SELECT  
    g.id,  
    g.bezeichnung,  
    m.id_person  
FROM  
    gremien g  
LEFT JOIN  
    mitglieder m  
ON  
    g.id = m.id_gremium  
WHERE  
    m.id_gremium = 10  

liefert wegen der speziellen Behandlung von NULL-Werten bei Vergleichen nur folgende Datensätze zurück, die Gremien, denen die Person mit der id 10 angehört:

id | bezeichnung | id_person
----------------------------
 1 | Spiel       | 10
 3 | Jugend      | 10

Führst Du jedoch die Einschränkung auf die Person mit der id 10 in der Join-Bedingung auf, so erhältst Du alle Gremien:

  
SELECT  
    g.id,  
    g.bezeichnung,  
    m.id_person  
FROM  
    gremien g  
LEFT JOIN  
    mitglieder m  
ON  
    g.id = m.id_gremium  
AND  
    m.id_gremium = 10  

id | bezeichnung | id_person
----------------------------
 1 | Spiel       | 10
 2 | SR          | NULL
 3 | Jugend      | 10
 4 | Ausbildung  | NULL

Da jede Person einem Gremium maximal einmal angehören kann und wir auf eine bestimmte Person prüfen, wird jedes Gremium auch genau einmal aufgeführt, kein Anlass, das Schlüsselwort DISTINCT oder grausamerweise sogar eine GROUP-BY-Klausel einzubauen.

Nehmen wir nun noch eine berechnete Spalte mit, die istmitglied heißt:

  
SELECT  
    g.id,  
    g.bezeichnung,  
    m.id_person,  
    (m.id > 0) AS istmitglied  
FROM  
    gremien g  
LEFT JOIN  
    mitglieder m  
ON  
    g.id = m.id_gremium  
AND  
    m.id_gremium = 10  

so erhalten wir aufgrund der besonderen Behandlung bei Vergleichen mit NULL-Werten:

id | bezeichnung | id_person | istmitglied
------------------------------------------
 1 | Spiel       | 10        | 1
 2 | SR          | NULL      | NULL
 3 | Jugend      | 10        | 1
 4 | Ausbildung  | NULL      | NULL

das heißt eben _nicht_ die Werte 0 und 1. Die Funktion COALESCE ermöglicht es,  0 statt NULL zu bekommen, denn COALESCE(NULL, 0) ergibt 0, COALESCE(1,0) ergibt jedoch 1:

  
SELECT  
    g.id,  
    g.bezeichnung,  
    m.id_person,  
    COALESCE(m.id > 0), 0) AS istmitglied  
FROM  
    gremien g  
LEFT JOIN  
    mitglieder m  
ON  
    g.id = m.id_gremium  
AND  
    m.id_gremium = 10  

liefert dagegen:

id | bezeichnung | id_person | istmitglied
------------------------------------------
 1 | Spiel       | 10        | 1
 2 | SR          | NULL      | 0
 3 | Jugend      | 10        | 1
 4 | Ausbildung  | NULL      | 0

Wende mein Beispiel auf Dein Problem an ...

Freundliche Grüße

Vinzenz