tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
24
ZUGRIFFE
9575
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Mik3e
    Mik3e Mik3e ist offline Mitglied Platin
    Registriert seit
    May 2005
    Beiträge
    732
    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 :
    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;
    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
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken MySQL: JOIN zweier Tabellen, deren Datensätze NICHT in der anderen Tabelle vorhanden-erd.jpg  
     

  2. #2
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    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.

  3. #3
    Avatar von Mik3e
    Mik3e Mik3e ist offline Mitglied Platin
    Registriert seit
    May 2005
    Beiträge
    732
    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
     

  4. #4
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    Zitat Zitat von Mik3e
    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.

    Zitat Zitat von Mik3e
    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

    Gruß hpvw
     
    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.

  5. #5
    Avatar von Mik3e
    Mik3e Mik3e ist offline Mitglied Platin
    Registriert seit
    May 2005
    Beiträge
    732
    Zitat Zitat von hpvw
    Meine zweite Persönlichkeit führt übrigends ein Leben ohne Comupter
    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
     

  6. #6
    Avatar von Mik3e
    Mik3e Mik3e ist offline Mitglied Platin
    Registriert seit
    May 2005
    Beiträge
    732
    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
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken MySQL: JOIN zweier Tabellen, deren Datensätze NICHT in der anderen Tabelle vorhanden-erd.jpg  
     

  7. #7
    Avatar von Mik3e
    Mik3e Mik3e ist offline Mitglied Platin
    Registriert seit
    May 2005
    Beiträge
    732
    Ich habe die Befürchtung, dass dieses Problem ohne SUBSELECT gar nicht zu lösen sein wird...
     

  8. #8
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    Zitat Zitat von Mik3e
    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).

    Zitat Zitat von Mik3e
    Viel Glück bei den Klausuren,
    Danke.

    Gruß hpvw
     
    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.

  9. #9
    Avatar von Mik3e
    Mik3e Mik3e ist offline Mitglied Platin
    Registriert seit
    May 2005
    Beiträge
    732
    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
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken MySQL: JOIN zweier Tabellen, deren Datensätze NICHT in der anderen Tabelle vorhanden-erd.jpg  
     

  10. #10
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    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.

  11. #11
    Avatar von Mik3e
    Mik3e Mik3e ist offline Mitglied Platin
    Registriert seit
    May 2005
    Beiträge
    732
    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
     

  12. #12
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    So, ich habe mal einen Versuch gestartet. An den Fett markierten Stellen musst Du die Bedingungs-IDs einfügen:
    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
    Bin gespannt, ob es Deinem Vorhaben nahe kommt. (Achtung: in der Ergebnistabelle heißt das Feld nur noch kategorie_id)

    Gruß hpvw
     
    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.

  13. #13
    Avatar von Mik3e
    Mik3e Mik3e ist offline Mitglied Platin
    Registriert seit
    May 2005
    Beiträge
    732
    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
     

  14. #14
    Avatar von Mik3e
    Mik3e Mik3e ist offline Mitglied Platin
    Registriert seit
    May 2005
    Beiträge
    732
    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
     

  15. #15
    Avatar von Mik3e
    Mik3e Mik3e ist offline Mitglied Platin
    Registriert seit
    May 2005
    Beiträge
    732
    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
    Geändert von Mik3e (03.07.05 um 13:29 Uhr)
     

Ähnliche Themen

  1. [MySQL] Datensätze bei denen ein Feld leer oder nicht vorhanden ist
    Von tequito im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 09.12.10, 17:04
  2. Alle Datensätze deren ID nicht in der anderen Tabelle ist
    Von zer0 im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 01.10.10, 21:51
  3. Datensatz löschen, wenn in einer anderen Tabelle nicht vorhanden
    Von port29 im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 15.08.10, 03:16
  4. [MySQL] Nicht in Tabelle vorhanden?
    Von moistwanted im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 29.02.08, 11:03
  5. Datensätze anhand Verknüpfung zweier Tabellen löschen?
    Von metty im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 25.10.04, 14:40