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

Ja, das ist richtig..
Im alten ERD gab es die Saalplan-Thematik noch nicht. Habe ich damals auch weggelassen um weniger Verwirrung zu stiften.

Dennoch stehe ich jetzt vor diesem (wirklich großem) Problem. Denn sollte das nicht zu managen sein, müsste ich das ERD nochmals ändern. Eine andere Form würde aber zu einer Normalverletzung (wie oben angegeben) führen.

Bist meine letzte Hoffnung :-)
 
Re: MySQL: JOIN zweier Tabellen, deren Datensätze NICHT in der anderen Tabelle vorhan

So, ich habe mal einen Versuch gestartet. An den Fett markierten Stellen musst Du die Bedingungs-IDs einfügen:
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)
WHERE tbl_saalplan_platz.fk_sektor_id=[dieSektorID]
GROUP BY tbl_saalplan_platz.pkp_saalplan_platz_id
Bin gespannt, ob es Deinem Vorhaben nahe kommt. (Achtung: in der Ergebnistabelle heißt das Feld nur noch kategorie_id)

Gruß hpvw
 
Hi!

Sorry, bin gestern vorm TV weggesackt :)
Werde das gleich mal versuchen... Wenn Du gerne experimentierst, häng ich Dir gerne den SQL Dump der vier Tables an..

LG
Mike
 
Geniale Sache, scheint zu funktionieren (mit ein paar adaptierungen)...
Ich hatte die if -verzweigung auch schon, aber irgendwo einen Hund drinnen...

Werde das jetzt mal ausgiebig mit meiner Applikation testen.

Danke vielmals,
LG
Mike
 
Hi hp!

Also wirklich sauber ist diese Lösung leider nicht..
Denn wenn einem Platz mehrere Kategorien (in verschiedenen Vorstellungen) zugewisen sind, gehts schon nicht mehr...

Grund:
Wenn der Platz zwei mal mit einer Kategorie verknüpft ist, liefert der LEFT Join natürlich auch zwei Datensätze:

Beispiel:
platz 1 -> Kat A (gehört zu der gewünschten Veranstaltung -> Liefert daher "Kat A")
platz 1 -> Kat B (gehört NICHT zu der gewünschten Veranstaltung -> Liefert daher NULL)


In der IF Verzweigung kommt er nun auch zweimal zu diesem Platz (da er das Select klarerweise erst nach dem JOIN ausführt). Somit setzt er das attribut kategorie_id zuerst auf "Kat A" (was auch stimmen würde), dann aber sofort auf NULL (was nicht stimmt).

D.h. je nach Ordnung der aus dem Join gelieferten Datensätze, gibt mir der Query eine andere kategorie_id zurück.

Eine andere Lösung (was eigentlich mein erster Ansatz war) wäre, dass man den Join mit einer Bedingung verknüpft. D.h.:

LEFT JOIN `tbl_kategorie` ON tbl_kategorie_join_platz.fk_kategorie_id=tbl_kategorie.pk_kategorie_id AND tbl_kategorie.fk_vorstellung_id=<VORSTELLUNG_ID>

Er sollte nach meinem Verständnis den JOIN nur dann ausführen, wenn die damit verbundene Bedingung erfüllt ist. Macht er allerdings nicht...

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

Dann versuch doch als zusätzliche Bedingung in der WHERE-Klausel nur die Plätze zur aktuellen Vorstellung zu selektieren:
Code:
... WHERE (...)
AND (tbl_kategorie.fk_vorstellung_id=[dieVorstellungID])
...
Gruß hpvw
 
Das geht deshalb nicht, weil er mir dann nur jene Datensätze liefert, die mit einer Kategorie verknüpft sind. Aber er soll mir ja ALLE Plätze des Sektors liefern, und nur bei denen, die bei der betroffenen Vorstellung mit einer Kategorie verknüpft sind auch die KategorieID...
 
Re: MySQL: JOIN zweier Tabellen, deren Datensätze NICHT in der anderen Tabelle vorhan

Na, dann nimmt man das halt mit rein:
Code:
... WHERE (...)
AND (tbl_kategorie.fk_vorstellung_id=[dieVorstellungID]
  OR tbl_kategorie.fk_vorstellung_id IS NULL)
...
 
Geht auch nicht.. Denn wenn ein Platz schon bei einer anderen Vorstellung einer Kategorie zugewiesen ist, liefert er den Datensatz nicht mehr aus.

Denn:
WHERE...
...
fk_vorstellung_id`=<VORSTELLUNGID> OR fk_vorstellung_id IS NULL
...

heißt ja, dass er mir den Datensatz liefert wenn:
1. Er entweder gar nicht einer Kategorie zugewiesen ist (ist richtig)
2. Wenn er einer Kategorie zugewiesen ist, dann nur, wenn die Kategorie zur entsprechenden Vorstellung gehört. Ist er jetzt bereits in einer anderen Vorstellung mit einer Kategorie verknüpft, liefert er mir den Datensatz nicht aus, weil:

fk_vorstellung_id=<VORSTELLUNGID> => FALSE
fk_vorstellung_id IS NULL => FALSE


Gibts ja nicht, dass es da keine einfache Lösung gibt.... Ich bin schon liecht verzweifelt.
 
Re: MySQL: JOIN zweier Tabellen, deren Datensätze NICHT in der anderen Tabelle vorhan

Vielleicht ist das der richtige Moment für HAVING:
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)
HAVING (tbl_kategorie.fk_vorstellung_id=[dieVorstellungID])
WHERE tbl_saalplan_platz.fk_sektor_id=[dieSektorID]
GROUP BY tbl_saalplan_platz.pkp_saalplan_platz_id
 
Zurück