Suchabfrage für Eigenschaftswerte in mehreren Zeilen
Helmut
- datenbank
Hallo zusammen,
ich habe gerade ein Denkproblem. Bei mir existieren (vereinfacht) drei Datenbanktabellen
Kleinanzeigen
ka_id,ka_name,ka_author
20,Meine Kleinanzeige,Theo Test
21,Meine zweite Kleinanzeige,Max Müller
KleinanzeigenFelder
kf_id, ka_id, ka_name
201,20,Automarke
202,20,Zulassungsjahr
203,20,Türanzahl
204,21,Mieter
KleinanzeigenValues
kv_id, ka_id, kf_id, kf_value
301, 20, 201, Audi
302, 20, 202, 2008
303, 20, 203, 4
Frage: Mit welcher SQL-Operation/mit welchem Join-Typ kann ich eine Suchabfrage realisieren a la "Gib mir alle Kleinanzeigen-IDs (ka_id), welche die Automarke Audi und 4 Türen haben". Ist das am besten mit einem Self-Join machbar oder welches Vorgehen empfehlt ihr? Das Problem ist, dass die Feldanzahl nicht fest und größer zwei ist, d.h. dass bspw. 6 oder 8 Felder auf ihren Inhalt überprüft werden müssten. An der Datenbankstruktur selbst kann ich aber leider nichts groß ändern.
Vielen Dank für jede Anregung
Helmut
n'abend,
Frage: Mit welcher SQL-Operation/mit welchem Join-Typ kann ich eine Suchabfrage realisieren a la "Gib mir alle Kleinanzeigen-IDs (ka_id), welche die Automarke Audi und 4 Türen haben". Ist das am besten mit einem Self-Join machbar oder welches Vorgehen empfehlt ihr? Das Problem ist, dass die Feldanzahl nicht fest und größer zwei ist, d.h. dass bspw. 6 oder 8 Felder auf ihren Inhalt überprüft werden müssten. An der Datenbankstruktur selbst kann ich aber leider nichts groß ändern.
SELECT k.*
FROM Kleinanzeigen k
WHERE k.ka_id IN ( SELECT f.ka_id FROM KleinanzeigenFelder f JOIN KleinanzeigenValues v ON v.kf_id = f.kf_id WHERE f.ka_name = "Automarke" AND v.kf_value = "Audi" )
AND k.ka_id IN ( SELECT f.ka_id FROM KleinanzeigenFelder f JOIN KleinanzeigenValues v ON v.kf_id = f.kf_id WHERE f.ka_name = "Türanzahl" AND v.kf_value = "4" );
Das ist zwar wirklich nicht das performanteste, aber sollte erst mal seinen Zweck erfüllen.
weiterhin schönen abend...
Klasse, vielen Dank globe! Manchmal braucht man einfach einen Denkanstoß und sieht den Wald vor lauter Bäumen nicht...