Sven Rautenberg: diffiziles SELECT

Beitrag lesen

Moin!

Du hast:
doc_tab:  id  type
Beispieldaten?

1 5
2 3
3 5
4 6

attr_tab: id  name data
Beispieldaten?

1 "username" "ckruse"
1 "password" "passwort"
1 "vname"    "Christian"
1 "nname    "Kruse"
....

Du willst:
erg_tab: id  type  name  data
Beispieldaten?

1 5 "username" "ckruse"
1 5 "password" "passwort"
1 5 "vname"    "Christian"
1 5 "nname"    "Kruse"

Das ist alles? Du willst zu einer eindeutig definierten ID in doc_tab alle Attribut-Einträge, die es dazu gibt? Ich sehe das Problem nicht so ganz. Die Abfrage erscheint mir ziemlich trivial. Vielleicht übersehe ich die ganze Zeit den Punkt, um den es dir wirklich geht.

So. Wenn ich den von dir beschriebenen Join benutzen wuerde, wuerde ich eine Ergebnismenge
von genau einer Reihe bekommen, naemlich:

1 5 "username" "ckruse"

Ähm, naja - hängt davon ab, was du so willst. Willst du eine Dokumenten-ID haben und zu denen alle Attribute wissen, oder hast du den Attributnamen und -wert und suchst dazu einerseits das zugehörige Dokument und andererseits rückwärts wieder alle anderen zugehörigen Attribute?

In diesem Fall würde ich in der Tat ohne größeres Nachdenken erst mal zwei JOINs (von der attr_tab zur doc_tab zurück zur attr_tab) veranschlagen - wenn du den Dokumententyp entbehren kannst, würde sich das auf ein JOIN reduzieren.

Der von mir beschriebene 3er-Join wuerde (vor dem where) eine Tabelle wie folgt liefern:

ID type  j1.name  j1.data  j2.name   j2.data
1 5 "username" "ckruse"   "username" "ckruse"
1 5 "username" "ckruse"   "password" "passwort"
1 5 "username" "ckruse"   "vname"    "Christian"
1 5 "username" "ckruse"   "nname"    "Kruse"
1 5 "password" "passwort" "username" "ckruse"
1 5 "password" "passwort" "passwort"
1 5 "password" "passwort" "Christian"
1 5 "password" "passwort" "Kruse"
....

Eben ein karthesisches Produkt. Deshalb kann ich die Menge durch ein where beschraenken.

Kartesische Produkte saugen[tm]. :)

Wenn du die Bildung der geJOINten Tabelle durch geeignete Formulierung des ON-Statements regulierst, kriegst du zumindest die Tabelle schon während des Enstehens kleiner, weil unerwünschte Kombinationen unterbleiben.

Sorry, aber ich bin mir sicher, dass ich deine Aufgabe noch nicht ganz verstanden habe. Deshalb wohl auch der Threadtitel.

SELECT a2.name, a2.data, d.type, d.id FROM a LEFT JOIN a AS a2 ON a.id=a2.id AND a.name="username" AND a.data ="ckruse" LEFT JOIN d ON a.id=d.id

Wenn ich nicht vollkommen danebenliege, dann sollte das so ungefähr liefern, was dich interessiert. Kann ich leider nicht ausprobieren - mein MySQL streikt gerade irgendwie.

--

 - Sven Rautenberg