Zum Inhalt springen

MYSQL Ausgabe auch wenn Felder nicht existieren


Empfohlene Beiträge

Geschrieben

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]

Geschrieben

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?

post-66256-14430449784045_thumb.jpg


[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]

Geschrieben

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 :)

Geschrieben (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 von kille1992
Geschrieben
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.
Geschrieben

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?

Geschrieben

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 :)

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...