Kibedo Geschrieben 26. Februar 2014 Geschrieben 26. Februar 2014 Hallo zusammen, ich hab ein kleines mysql Problem und hoffe ich kann es so erklären, dass man verstehen kann was ich meine. Ich habe ein Programm, welches auf die ADS zugreift und ausliest. Die Daten der Benutzer schreibt es aber in eine Spalte ("ADSObjectValue"). Jeder Benutzer hat eine eindeutige ID ("ADSObjectID"). Um nun den Benutzernamen, Vornamen oder zum Beispiel den Nachnamen abzufragen, hat man die Spalte "ADSPropertyID" zur Verfügung, wo jedes Feld eine eigene ID hat ("z.B.: Vorname = 16"). Soweit funktioniert die Abfrage auch super. Das Problem jedoch ist, dass wenn ein Benutzer nun zum Beispiel keine Rufnummer eingetragen hat, dieses Feld in der Datenbank nicht existiert. Somit bekomme ich bei der Abfrage nur die Benutzer ausgegeben, bei denen die Felder Name, Vorname, Nachname, Email und Rufnummer vorhanden sind. Ich bräuchte nun also eine Idee, wie ich der Abfrage sagen kann, dass sie mir einen Datensatz auch ausgeben soll, wenn ein oder mehrere Felder nicht existieren. Wäre froh wenn mir jemand bei dem Problem helfen könnte. Vielen Dank schon mal [COLOR="#008000"][COLOR="#0000FF"]select[/COLOR] tblName.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] Name, tblVorname.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] Vorname, tblNachname.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] Nachname, tblEMail.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] EMail, tblRufnummer.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] Rufnummer, tADSObject.AccountEnabled [COLOR="#0000FF"]from[/COLOR] tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblName, tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblVorname, tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblNachname, tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblEMail, tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblRufnummer, tADSDocu, tADSObject [COLOR="#0000FF"]where[/COLOR] tADSDocu.DocuID = tADSObject.DocuID [COLOR="#0000FF"]and[/COLOR] tADSDocu.Archiv = 0 [COLOR="#0000FF"]and[/COLOR] tADSObject.ADSObjectID = tblName.ADSObjectID [COLOR="#0000FF"]and[/COLOR] tblName.ADSPropertyID = 14 [COLOR="#0000FF"]and[/COLOR] tblVorname.ADSPropertyID = 16 [COLOR="#0000FF"]and[/COLOR] tblNachname.ADSPropertyID = 17 [COLOR="#0000FF"]and[/COLOR] tblEMail.ADSPropertyID = 8 [COLOR="#0000FF"]and[/COLOR] tblRufnummer.ADSPropertyID = 21 [COLOR="#0000FF"]and[/COLOR] tblName.ADSObjectID = tblVorname.ADSObjectID [COLOR="#0000FF"]and[/COLOR] tblVorname.ADSObjectID = tblNachname.ADSObjectID [COLOR="#0000FF"]and[/COLOR] tblNachname.ADSObjectID = tblEMail.ADSObjectID [COLOR="#0000FF"]and[/COLOR] tblEMail.ADSObjectID = tblRufnummer.ADSObjectID[/COLOR] Zitieren
Klotzkopp Geschrieben 26. Februar 2014 Geschrieben 26. Februar 2014 Schau dir JOIN an, damit geht das. Du solltest die Verknüpfung zwischen den Tabellen ohnehin nicht mittels WHERE-Klauseln machen. Zitieren
Aras Geschrieben 26. Februar 2014 Geschrieben 26. Februar 2014 Im konkreten Fall muss man mit einem OUTER JOIN arbeiten. Zitieren
Kibedo Geschrieben 3. März 2014 Autor Geschrieben 3. März 2014 Vielen Dank erstmal für die Antworten hab etwas länger gebraucht aufgrund der Fasnachtszeit habe mir mal die Join's angeschaut. Outer join's gibt es in dem sinn ja nicht was sich jedoch mit einer kombinierten Lösung von left und right join umsetzen lässt. Habe unten meinen neuen Code und ein Bild angehängt. Damit es übersichtlicher bleibt, habe ich mal nur zwei Tabellen genommen. Das Problem ist dass die Join Lösung die nicht existierenden Felder auch nicht mit "Null" einfügt, sondern dass der ganze Datensatz nicht ausgegeben wird, auch wenn er in Tabelle 1 vorhanden ist. Liegt der Fehler nun in meiner eventuell falschen Anwendung der Join's oder ist es einfach nicht möglich dieses Abfrage zu stellen, da alles in einer Tabelle steckt und die Felder nicht existieren? [COLOR="#008000"] [COLOR="#0000FF"]select [/COLOR] tblName.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] Name, tblVorname.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] Vorname [COLOR="#0000FF"]from[/COLOR] tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblName [COLOR="#0000FF"]left join [/COLOR] tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblVorname [COLOR="#0000FF"]on[/COLOR] (tblName.ADSObjectID = tblVorname.ADSObjectID) [COLOR="#0000FF"]where[/COLOR] tblName.ADSPropertyID = 14 [COLOR="#0000FF"]and[/COLOR] tblVorname.ADSPropertyID = 16 [COLOR="#0000FF"]union[/COLOR] [COLOR="#0000FF"]select [/COLOR] tblName.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] Name, tblVorname.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] Vorname [COLOR="#0000FF"]from [/COLOR] tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblName [COLOR="#0000FF"]right join [/COLOR] tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblVorname [COLOR="#0000FF"]on[/COLOR] (tblName.ADSObjectID = tblVorname.ADSObjectID) [COLOR="#0000FF"]where[/COLOR] tblName.ADSPropertyID = 14 [COLOR="#0000FF"]and[/COLOR] tblVorname.ADSPropertyID = 16[/COLOR] Zitieren
Klotzkopp Geschrieben 3. März 2014 Geschrieben 3. März 2014 Outer join's gibt es in dem sinn ja nicht Wie bitte? Zitieren
Kibedo Geschrieben 3. März 2014 Autor Geschrieben 3. März 2014 Ich meinte mit der Aussage, dass es sich um eine MySQL Datenbank handelt und somit es dort keinen full outer join gibt wie bei SQL. Entschuldige falls das zu Verwirrung geführt haben sollte Zitieren
Klotzkopp Geschrieben 3. März 2014 Geschrieben 3. März 2014 Ich hab das mal kurz nachgebaut, und erhalte das gewünschte Ergebnis: Benutzer1 Hans Benutzer2 NULL NULL Peter[/code] Zitieren
lilith2k3 Geschrieben 3. März 2014 Geschrieben 3. März 2014 @Klotzkopp: Magst Du Deine Lösung evtl. hier "zeigen": SQL Fiddle ? Dann kann man sehen, was Du wie gemacht hast :] Zitieren
Kibedo Geschrieben 3. März 2014 Autor Geschrieben 3. März 2014 (bearbeitet) oke danke euch zwei das Problem entsteht wohl wenn das Programm die Daten einliest. Da es im Gegensatz zu jeder menschlich logischen Entscheidung leere Felder nicht mit "NULL" belegt, sondern sie weglässt, möglicher weise um Platz zu sparen Passe ich nun deinen Code dahin gehen an, [COLOR="#800080"]INSERT INTO[/COLOR][COLOR="#0000FF"]`new_table`[/COLOR][COLOR="#800080"] VALUES[/COLOR] (1001,14,[COLOR="#B22222"]'Benutzer1'[/COLOR]),(1001,16,[COLOR="#B22222"]'Hans'[/COLOR]),(1002,14,[COLOR="#B22222"]'Benutzer2'[/COLOR]),(1003,16,[COLOR="#B22222"]'Peter'[/COLOR]); hier auch auf der sher tollen seite Fiddle zu sehn: SQL Fiddle dann entsteht genau das beschriebene Problem Bearbeitet 3. März 2014 von kille1992 Zitieren
Klotzkopp Geschrieben 3. März 2014 Geschrieben 3. März 2014 Da es im Gegensatz zu jeder menschlich logischen Entscheidung leere Felder nicht mit "NULL" belegt, sondern sie weglässt, möglicher weise um Platz zu sparen Äh, nein. Ich hatte dein Diagramm so gelesen, dass für fehlende Attribute dennoch ein Datensatz vorhanden ist, nur dass der Wert NULL ist. Zitieren
Kibedo Geschrieben 3. März 2014 Autor Geschrieben 3. März 2014 oke stimmt, da ist ein Fehler in meiner Abbildung muss natürlich so aussehen: Zitieren
Klotzkopp Geschrieben 3. März 2014 Geschrieben 3. März 2014 Du hast deine Daten mittels Entity–attribute–value model modelliert. Dadurch bist du zwar sehr flexibel und platzsparend, aber deine Abfragen werden erheblich komplizierter. In deinem konkreten Fall kommst du mit einem einfachen JOIN nicht weiter, weil es zu einigen Objekten eben nur eines der Attribute gibt. Die Frage ist, ist die Wahl des Datenmodells bewusst erfolgt, und wenn ja, aus welchem Grund? Zitieren
Kibedo Geschrieben 3. März 2014 Autor Geschrieben 3. März 2014 Leider habe ich keinen Einfluss auf das Datenmodell. Wurde wohl von der Firma so gewählt um die Datenbank kleiner zu halten. Die Datenbank ist momentan so etwas mehr wie 14 GB groß. wenn ich hier mit den join nicht weiter komme, werde ich wohl mit den Herstellern Kontakt aufnehmen Trotzdem Vielen Dank Zitieren
Klotzkopp Geschrieben 3. März 2014 Geschrieben 3. März 2014 So geht's, aber ob das gut ist, weiß ich nicht: SQL Fiddle Du brauchst ein Feld, das immer da ist, sowie ein JOIN pro Attribut. Zitieren
Kibedo Geschrieben 4. März 2014 Autor Geschrieben 4. März 2014 Also es klappt wunderbar Vielen vielen herzlichen Dank für die Hilfe [COLOR="#008000"] [COLOR="#0000FF"]select[/COLOR] [COLOR="#0000FF"]distinct[/COLOR] tblID.ADSObjectID [COLOR="#0000FF"]as[/COLOR] ID, tblName.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] Name, tblVorname.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] Vorname, tblNachname.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] Nachname, tblEMail.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] EMail, tblRufnummer.ADSObjectValue [COLOR="#0000FF"]as[/COLOR] Rufnummer, tblAktiv.AccountEnabled [COLOR="#0000FF"]as[/COLOR] Aktiv [COLOR="#0000FF"]from[/COLOR] tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblID [COLOR="#0000FF"]left join[/COLOR] tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblName [COLOR="#0000FF"]on[/COLOR] tblID.ADSObjectID = tblName.ADSObjectID [COLOR="#0000FF"]and[/COLOR] tblName.ADSPropertyID = 14 [COLOR="#0000FF"]left join[/COLOR] tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblVorname [COLOR="#0000FF"]on[/COLOR] tblID.ADSObjectID = tblVorname.ADSObjectID [COLOR="#0000FF"]and[/COLOR] tblVorname.ADSPropertyID = 16 [COLOR="#0000FF"]left join[/COLOR] tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblNachname [COLOR="#0000FF"]on[/COLOR] tblID.ADSObjectID = tblNachname.ADSObjectID [COLOR="#0000FF"]and[/COLOR] tblNachname.ADSPropertyID = 17 [COLOR="#0000FF"]left join[/COLOR] tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblEMail [COLOR="#0000FF"]on[/COLOR] tblID.ADSObjectID = tblEMail.ADSObjectID [COLOR="#0000FF"]and[/COLOR] tblEMail.ADSPropertyID = 30 [COLOR="#0000FF"]left join[/COLOR] tADSObjectValue [COLOR="#0000FF"]as[/COLOR] tblRufnummer [COLOR="#0000FF"]on[/COLOR] tblID.ADSObjectID = tblRufnummer.ADSObjectID [COLOR="#0000FF"]and[/COLOR] tblRufnummer.ADSPropertyID = 21 [COLOR="#0000FF"]left join[/COLOR] tADSObject [COLOR="#0000FF"]as[/COLOR] tblAktiv [COLOR="#0000FF"]on[/COLOR] tblID.ADSObjectID = tblAktiv.ADSObjectID [COLOR="#0000FF"]left join[/COLOR] tADSDocu [COLOR="#0000FF"]as[/COLOR] tblDocu [COLOR="#0000FF"]on[/COLOR] tblAktiv.DocuID = tblDocu.DocuID [COLOR="#0000FF"]where[/COLOR] tblID.ADSObjectID = tblAktiv.ADSObjectID [COLOR="#0000FF"]and[/COLOR] tblAktiv.DocuID = tblDocu.DocuID [COLOR="#0000FF"]and[/COLOR] tblDocu.Archiv = 0 [COLOR="#0000FF"]and[/COLOR] tblID.ADSObjectValue [COLOR="#0000FF"]like[/COLOR] [COLOR="#B22222"]'CN=Person%'[/COLOR] [/COLOR] Sieht hinter her total einfach aus. Hat mich aber einige Nerven gekostet Sollte wirklich wieder etwas öfters mit MySql arbeiten Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.