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