ERLEDIGT
NEIN
NEIN
ANTWORTEN
24
24
ZUGRIFFE
9575
9575
EMPFEHLEN
-
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):
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.Code :1 2 3 4 5 6 7 8
#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;
Bin bisher leider nicht über den Stein der Weisen gestolpert in der Angelegenheit.
Danke im Voraus & LG
Mike
-
Code :
1 2 3 4 5 6 7
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
Warum gibt (fast) keiner im Datenbankforum an, welches DBMS er benutzt?
Ich gehe im Zweifelsfall ohne Nachfrage von MySQL > 4.1 i.V.m. PHP aus.
Gewöhnt euch bitte auch an, die Fehlermeldung von mysql_error() zu posten.
-
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
-
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.
Zitat von Mik3e
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.
Zitat von Mik3e
Meine zweite Persönlichkeit führt übrigends ein Leben ohne Comupter
Gruß hpvwWarum gibt (fast) keiner im Datenbankforum an, welches DBMS er benutzt?
Ich gehe im Zweifelsfall ohne Nachfrage von MySQL > 4.1 i.V.m. PHP aus.
Gewöhnt euch bitte auch an, die Fehlermeldung von mysql_error() zu posten.
-
Na dann bin ich ja froh, dass ich nicht der einzige schizophrene IT-Freak hier bin
Zitat von hpvw

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 2 3
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 :1 2 3 4 5 6 7
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
-
Ich habe die Befürchtung, dass dieses Problem ohne SUBSELECT gar nicht zu lösen sein wird...
-
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.
Zitat von Mik3e
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).
Danke.
Zitat von Mik3e
Gruß hpvwWarum gibt (fast) keiner im Datenbankforum an, welches DBMS er benutzt?
Ich gehe im Zweifelsfall ohne Nachfrage von MySQL > 4.1 i.V.m. PHP aus.
Gewöhnt euch bitte auch an, die Fehlermeldung von mysql_error() zu posten.
-
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
-
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?Warum gibt (fast) keiner im Datenbankforum an, welches DBMS er benutzt?
Ich gehe im Zweifelsfall ohne Nachfrage von MySQL > 4.1 i.V.m. PHP aus.
Gewöhnt euch bitte auch an, die Fehlermeldung von mysql_error() zu posten.
-
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
-
So, ich habe mal einen Versuch gestartet. An den Fett markierten Stellen musst Du die Bedingungs-IDs einfügen:
Bin gespannt, ob es Deinem Vorhaben nahe kommt. (Achtung: in der Ergebnistabelle heißt das Feld nur noch kategorie_id)Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
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=[b][dieVorstellungID][/b], 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=[b][dieSektorID][/b] GROUP BY tbl_saalplan_platz.pkp_saalplan_platz_id
Gruß hpvwWarum gibt (fast) keiner im Datenbankforum an, welches DBMS er benutzt?
Ich gehe im Zweifelsfall ohne Nachfrage von MySQL > 4.1 i.V.m. PHP aus.
Gewöhnt euch bitte auch an, die Fehlermeldung von mysql_error() zu posten.
-
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
MikeGeändert von Mik3e (03.07.05 um 13:29 Uhr)
Ähnliche Themen
-
[MySQL] Datensätze bei denen ein Feld leer oder nicht vorhanden ist
Von tequito im Forum Relationale DatenbanksystemeAntworten: 1Letzter Beitrag: 09.12.10, 17:04 -
Alle Datensätze deren ID nicht in der anderen Tabelle ist
Von zer0 im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 01.10.10, 21:51 -
Datensatz löschen, wenn in einer anderen Tabelle nicht vorhanden
Von port29 im Forum Relationale DatenbanksystemeAntworten: 1Letzter Beitrag: 15.08.10, 03:16 -
[MySQL] Nicht in Tabelle vorhanden?
Von moistwanted im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 29.02.08, 11:03 -
Datensätze anhand Verknüpfung zweier Tabellen löschen?
Von metty im Forum Relationale DatenbanksystemeAntworten: 3Letzter Beitrag: 25.10.04, 14:40





Zitieren
Login





