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

Mik3e

Erfahrenes Mitglied
Abend!

Klingt etwas verwirrend der Thread, hier die Erklärung:

Es gibt zwei Tabellen, siehe ERD.

Nun möchte ich aus der Tabelle "tbl_saalplan_platz" alle Datensätze auslesen, die NICHT als Fremdschlüssel in der Tabelle "tbl_kategorie_join_platz" vorhanden sind.

Beispiel (zur leichteren Verständlichkeit sind die Attribute vom ERD gekürzt):
Code:
#tbl_saalplan_platz (pk_saalplan_platz_id, saalplan_platz_element_xbezeichnung)
1; testdatensatz 1
2; testdatensatz 2
3; testdatensatz 3

#tbl_kategorie_join_platz (fk_saalplan_platz_id)
1;
2;
Der SQL Query soll mir nun nur den dritten Datensatz der Tabelle "tbl_saalplan_platz" liefern. (3; testdatensatz 3). Ergibt sich daraus, da die beiden Primärschlüssel der Tabelle "tbl_saalplan_platz" in der Tabelle "tbl_kategorie_joing_platz" vorhanden sind.

Bin bisher leider nicht über den Stein der Weisen gestolpert in der Angelegenheit.
Danke im Voraus & LG
Mike
 

Anhänge

  • erd.jpg
    erd.jpg
    50,1 KB · Aufrufe: 808
Re: MySQL: JOIN zweier Tabellen, deren Datensätze NICHT in der anderen Tabelle vorhan

Code:
SELECT *
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)
WHERE 
tbl_kategorie_join_platz.fk_saalplan_platz_id IS NULL
 
Dankeschön.. wußte nicht, das IS NULL auch auf die Datensatzanzahl angewandt werden kann..
Andere Frage: Hast Du eigentlich auch noch ein Leben neben dem Forum :)

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

Mik3e hat gesagt.:
Dankeschön.. wußte nicht, das IS NULL auch auf die Datensatzanzahl angewandt werden kann..
Wird es auch nicht. LEFT JOIN verknüpft, im Gegensatz zu JOIN, die Tabellen auf die Weise, dass die Datensätze aus der linken Tabelle mindestens einmal im Ergebnis auftauchen. Sollte es zu einem Datensatz aus der linken Tabelle keinen der ON-Bedingung entsprechenden Datensatz in der rechten Tabelle geben, werden die Felder der rechten Tabelle null gesetzt. Dies macht man sich bei dieser Abfrage zunutze. Es ist jedoch darauf zu achten, dass das Feld, welches man mit IS NULL vergleicht als NOT NULL definiert ist, da sonst auch Datensätze aufgenommen werden können, die eine Entsprechung in der der rechten Tabelle haben. Fremdschlüssel sind in der Regel NOT NULL.

Mik3e hat gesagt.:
Andere Frage: Hast Du eigentlich auch noch ein Leben neben dem Forum :)
Demnächst stehen Klausuren an. Tutorials.de ist als Ablenkung vom Lernen noch besser geeignet als "Zimmer aufräumen" und macht wesentlich mehr Spaß. Das Gewissen leidet allerdings.
Meine zweite Persönlichkeit führt übrigends ein Leben ohne Comupter :D

Gruß hpvw
 
Re: MySQL: JOIN zweier Tabellen, deren Datensätze NICHT in der anderen Tabelle vorhan

hpvw hat gesagt.:
Meine zweite Persönlichkeit führt übrigends ein Leben ohne Comupter :D

Na dann bin ich ja froh, dass ich nicht der einzige schizophrene IT-Freak hier bin :)

Das er beim LEFT JOIN im Gegensatz zum INNER JOIN alle Datensätze verwendet, war mir klar. Das er im Hintergrund die Werte auf NULL setzt, wußte ich nicht.

LG
Mike
 
Sorry, muss nochmal nerven..
Jetzt wirds etwas komplexer. Die Tabelle "tbl_kategorie_join_platz" ist (wie der Name verrät) eine assoziative Tabelle.

Sie verbindet die Datensätze der Tabelle "tbl_saalplan_platz" mit den Datensätzen der Tabelle "tbl_kategorie". Richtig, die Tabelle "tbl_kategorie" ist bei diesem ERD neu.

Ich muss den Query nun dahin erweitern, dass er mir
Code:
1. alle Datensätze aus Tabelle "tbl_saalplan_platz" liefert
2. die NICHT in Tabelle "tbl_kategorie_join_platz" verknüpft sind, sofern der Fremdschlüssel in dieser Tabelle besagt, 
3. dass das Attribut "fk_vorstellung_id" in Tabelle "tbl_kategorie" einen bestimmten, eindeutigen Wert hat

Mein bisheriger (fehlgeschlagener Versuch) sieht so aus:
Code:
SELECT
t1.`pk_saalplan_platz_id` AS `pk_saalplan_platz_id`
FROM `tbl_saalplan_platz` AS t1
LEFT JOIN `tbl_kategorie_join_platz` AS t2 ON t1.`pk_saalplan_platz_id`=t2.`fk_saalplan_platz_id`
LEFT JOIN `tbl_kategorie` AS t3 ON t2.`fk_kategorie_id`=t3.`pk_kategorie_id`
WHERE t1.`fk_sektor_id`='<BESTIMMTER WERT>' 
AND (t2.`fk_saalplan_platz_id` IS NULL AND t3.`fk_vorstellung_id`='<BESTIMMTER WERT>')

Liegt meiner Meinung nach (wäre zumindest logisch) daran, dass die Regeln der WHERE-Clause erst auf die ausgelesenen Datensätze angewandt wird. Nachdem in Tabelle "tbl_kategorie_join_platz" aber möglicherweise kein einziger Datensatz vorhanden ist, liefert das SELECT auch keine Datensätze für die WHERE Clause.

Ist schon etwas komplexer.. Hoffe Du kannst mir damit auch helfen.
Viel Glück bei den Klausuren,
LG
Mike
 

Anhänge

  • erd.jpg
    erd.jpg
    65,8 KB · Aufrufe: 410
Ich habe die Befürchtung, dass dieses Problem ohne SUBSELECT gar nicht zu lösen sein wird...
 
Re: MySQL: JOIN zweier Tabellen, deren Datensätze NICHT in der anderen Tabelle vorhan

Mik3e hat gesagt.:
Liegt meiner Meinung nach (wäre zumindest logisch) daran, dass die Regeln der WHERE-Clause erst auf die ausgelesenen Datensätze angewandt wird. Nachdem in Tabelle "tbl_kategorie_join_platz" aber möglicherweise kein einziger Datensatz vorhanden ist, liefert das SELECT auch keine Datensätze für die WHERE Clause.
Das sehe ich auch so. Du benötigst irgendeine Bedingung, über die eine Beziehung zwischen dem Datensatz in der tbl_saalplan_platz-Tabelle und der tbl_kategorie-Tabelle hergestellt wird. Wenn eine solche Verbindung nicht existiert, sehe ich auch für ein Subquery schlechte Karten.

Wenn ich Dich richtig verstanden habe, bedeutet das ja: Finde die Datensätze, die in keiner Beziehung zur anderen Tabelle stehen und dort einen bestimmten Wert haben.

Da ich nicht glaube, dass Du das so meinst, schau noch mal in Deine Tabellenstruktur und versuche die Bedingungen etwas klarer zu formulieren (bitte nicht in Code-Tags, da muss man so viel scrollen).

Mik3e hat gesagt.:
Viel Glück bei den Klausuren,
Danke.

Gruß hpvw
 
Hi!

Einfach gesagt brauche ich folgendes Resultat:
Ich brauche alle Plätze aus der Tabelle "tbl_saalplan_platz", die zu einem bestimmten Sektor gehören (Attribut: fk_sektor_id).
Alle Plätze, die mit einer Kategorie verknüpft sind (Tabelle "tbl_kategorie_join_platz"), sollen zusätzlich das Attribut "fk_kategorie_id" aus dieser Tabelle mitliefern, jene die nicht verknüpft sind sollen bei diesem Attribut NULL liefern.

Soweit kein Problem.
ABER:
Er darf mir den Wert für das Attribut "fk_kategorie_id" nur dann liefern, wenn die zugewiesene Kategorie zu einer bestimmten Vorstellung gehört (Tabelle "tbl_kategorie" -> Attribut "fk_vorstellung_id"). Ansonsten soll er ebenfalls NULL für das Attribut "fk_kategorie_id" liefern.
--------------------------------------------------------------------------

Ich experimentiere gerade mit UNION rum, scheint aber auch nicht wirklich zu klappen.
Eine unelegante Lösung wäre sicher, das Attribut "fk_vorstellung_id" einfach in der assoziativen Tabelle mitzuführen ("tbl_kategorie_join_platz"). Das wäre dann aber doch eine böse normalverletzung. Ich hab Dir zum Verständnis auch noch die Tabelle für die Vorstellungen ins ERD eingebaut.

Ich stehe echt an, wüßte nicht, wie ich das lösen könnte.. Da brauchts nen echten SQL Profi denke ich. Oder ich steh einfach nur auf einer verdammt fetten Leitung...

LG
Mike
 

Anhänge

  • erd.jpg
    erd.jpg
    68,4 KB · Aufrufe: 366
Re: MySQL: JOIN zweier Tabellen, deren Datensätze NICHT in der anderen Tabelle vorhan

Kann es sein, dass folgendes (oder ähnlich) in Deinem letzten Post nicht dargestellt ist?
Der Saalplanplatz ist über Sektor und der über Saalplan mit der Vorstellung verknüpft?
 

Neue Beiträge

Zurück