MySQL: JOIN zweier Tabellen, deren Datensätze NICHT in der anderen Tabelle vorhanden

?
Ist in diesem Zusammenhang ja belanglos ob Where oder Having.. Having dient ja nur dazu, um Funktionen des SQL Queries ansprechen zu können..:
Wenn ich das so implementiere gibt er mir wiederum ja nur jene zurück, die bereits einer Kategorie zugewiesen sind...
 
Re: MySQL: JOIN zweier Tabellen, deren Datensätze NICHT in der anderen Tabelle vorhan

Ups, sorry, habe mich in der Eile voll verannt. Having ist natürlich Blödsinn, aber evtl. hilft es, die Bedingung mit ins ON zu nehmen:
Code:
SELECT
tbl_saalplan_platz.pk_saalplan_platz_id,
tbl_saalplan_platz.fk_sektor_id,
tbl_saalplan_platz.saalplan_platz_element_xpos,
tbl_saalplan_platz.saalplan_platz_element_ypos,
tbl_saalplan_platz.saalplan_platz_element_xbezeichnung,
tbl_saalplan_platz.saalplan_platz_element_ybezeichnung,
tbl_saalplan_platz.saalplan_ist_platz,
if(tbl_kategorie.fk_vorstellung_id=[dieVorstellungID],
  tbl_kategorie_join_platz.fk_kategorie_id,
  NULL) AS kategorie_id
FROM tbl_saalplan_platz
LEFT JOIN tbl_kategorie_join_platz
ON (tbl_saalplan_platz.pk_saalplan_platz_id
  =tbl_kategorie_join_platz.fk_saalplan_platz_id)
LEFT JOIN tbl_kategorie
ON (tbl_kategorie_join_platz.fk_kategorie_id
  =tbl_kategorie.pk_kategorie_id
  AND tbl_kategorie.fk_vorstellung_id=[dieVorstellungID])
WHERE tbl_saalplan_platz.fk_sektor_id=[dieSektorID]
GROUP BY tbl_saalplan_platz.pkp_saalplan_platz_id
Ansonsten fällt mir nur noch ein, statt mit tbl_kategorie einen LEFT JOIN zu machen, dort ein Subselect der Tabelle tbl_kategorie einzusetzen, in dem Du nur Kategorien selektierst, die zur entsprechenden Vorstellung gehören.

Gruß hpvw

PS: Wunder Dich nicht, wenn Du bis Mitte nächster Woche nichts von mir hörst ... mein Leben neben dem Forum ruft.
 
Alles klar..
Ich hab das eigentliche Problem lokalisiert...

Wenn wir von dem normalen Left-Join ausgehen, so liefert mir der (ohne Where-Clause) folgenden Recordset (gekürztes beispiel):

PLATZID | KATID | VORID
1 | Kat A | Vor 1
1 | Kat B | Vor 2
2 | NULL | NULL
2 | Kat A | Vor 1
3 | NULL | NULL

Wende ich nun die WHERE-Clause mit folgender Bedingung an:

WHERE
(KATID IS NULL AND VORID IS NULL)
OR
(VORID=1)

wird der Recordset folgendermaßen gekürzt:

1 | Kat A | Vor 1 -> JA
1 | Kat B | Vor 2 -> NEIN
2 | NULL | NULL -> JA
2 | Kat A | Vor 1 -> JA
3 | NULL | NULL -> JA

Und beim Platz mit der ID 2 siehst Du das Problem sehr schön. Er liefert 2 Datensätze, obwohl es nur einer sein darf (da beide Bedingungen erfüllt sind).

LG
Mike
 
Re: MySQL: JOIN zweier Tabellen, deren Datensätze NICHT in der anderen Tabelle vorhan

Na gut, ein hab ich noch, warte nur noch darauf, dass ich abgeholt werde:
Code:
SELECT
tbl_saalplan_platz.pk_saalplan_platz_id,
tbl_saalplan_platz.fk_sektor_id,
tbl_saalplan_platz.saalplan_platz_element_xpos,
tbl_saalplan_platz.saalplan_platz_element_ypos,
tbl_saalplan_platz.saalplan_platz_element_xbezeichnung,
tbl_saalplan_platz.saalplan_platz_element_ybezeichnung,
tbl_saalplan_platz.saalplan_ist_platz,
if(tbl_kategorie.fk_vorstellung_id=[dieVorstellungID],
  tbl_kategorie_join_platz.fk_kategorie_id,
  NULL) AS kategorie_id
FROM tbl_saalplan_platz
LEFT JOIN tbl_kategorie_join_platz
ON (tbl_saalplan_platz.pk_saalplan_platz_id
  =tbl_kategorie_join_platz.fk_saalplan_platz_id)
LEFT JOIN tbl_kategorie
ON (tbl_kategorie_join_platz.fk_kategorie_id
  =tbl_kategorie.pk_kategorie_id
  AND tbl_kategorie.fk_vorstellung_id=[dieVorstellungID]
#Sieht blöd aus, aber die Idee ist, dass er die Zeilen,
#in denen es null ist raus nimmt und wenn es keine 
#entsprechene Zeile gibt wieder (LEFT JOIN) 
#eine mit null einfügt
#evtl. musst Du das mal mit anderen Attributen aus einer
#anderen Tabelle probieren oder auch sonst irgendwie 
#mit den anderen Ideen kombinieren
#... ich muss los Tschüss
  AND tbl_kategorie.fk_vorstellung_id IS NOT NULL)
WHERE tbl_saalplan_platz.fk_sektor_id=[dieSektorID]
GROUP BY tbl_saalplan_platz.pkp_saalplan_platz_id
 
Danke... genieß die IT freien Tage :)
Ich werd das Teil jetzt einfach in zwei Methoden zerlegen:
1. Liefert mir die Platzinformation
2. Prüft, ob der jeweilige Platz mit einer Kategorie belegt ist.
Fertig..

Die zwei SQL Statements sind unterm Strich wahrscheinlich auch schneller als das eine mächtig große :)

LG
Mike
 
Zurück