Veröffentlicht 26. Februar 201411 j 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]
26. Februar 201411 j Schau dir JOIN an, damit geht das. Du solltest die Verknüpfung zwischen den Tabellen ohnehin nicht mittels WHERE-Klauseln machen.
3. März 201411 j Autor 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]
3. März 201411 j Autor 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
3. März 201411 j Ich hab das mal kurz nachgebaut, und erhalte das gewünschte Ergebnis: Benutzer1 Hans Benutzer2 NULL NULL Peter[/code]
3. März 201411 j @Klotzkopp: Magst Du Deine Lösung evtl. hier "zeigen": SQL Fiddle ? Dann kann man sehen, was Du wie gemacht hast :]
3. März 201411 j Autor 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 201411 j von kille1992
3. März 201411 j 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.
3. März 201411 j 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?
3. März 201411 j Autor 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
3. März 201411 j 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.
4. März 201411 j Autor 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
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.