Helmut: Suchabfrage für Eigenschaftswerte in mehreren Zeilen

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

  1. 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...

    --
    #selfhtml hat ein Forum?
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
    1. Klasse, vielen Dank globe! Manchmal braucht man einfach einen Denkanstoß und sieht den Wald vor lauter Bäumen nicht...