Hirarchischer Filter

Status
Nicht offen für weitere Antworten.

m@nu

Bekanntes Mitglied
hi zusammen :)

also ich denk mal, das ist ein datenbank thema...
für meine bilderverwaltung möchte ich jedem bild schlüsselwörter zuweisen. das ist vorerst auch einmal kein problem (insgesamt 3 tabellen: keywords, keywordimageconnector, images)
doch nun möchte ich meine schlüsselwörter in eine hirarchische struktur bringen können. sprich das schlüsselwort "auto" kann unterschlüsselwörter wie "audi" & "bmw" enthalten.
:arrow: setzt man nun den filter mit dem schlüsselwort "auto", so sollen alle unterschlüsselwörter ebenfalls mit-gefiltert werden...

momentan erstelle ich die hirarchische struktur mit dem feld "parent" in meiner keywords-tabelle.
Code:
+-----------+------------+--------+
| keywordid | name       | parent |
+-----------+------------+--------+
| 1         | auto       | -1     |
| 2         | bmw        | 1      |
| 3         | audi       | 1      |
| 4         | boot       | -1     |
| 5         | zodiac     | 4      |
+-----------+------------+--------+

meine frage nun: wie kann ich den oben beschriebenen mechanismus (siehe ":arrow:") am einfachsten programmieren?
eine rekursive methode welche den entsprechenden WHERE-string zusammenstellt erscheint mir arg performance-fressend...

any ideas?

vielen dank im voraus & greetz :)
m@nu
 
G

Guest

Gast
Wie wäre es mit sowas? :shock:
Code:
SELECT DISTINCT i.imageid
FROM images i, keywordimageconnector c
WHERE i.imageid = c.imageid
  AND c.keywordid IN (

    /* indirekte Treffer anhand des Parents */
    SELECT DISTINCT k2.keywordid
    FROM keywords k2
    WHERE parent IN (
      SELECT k1.keywordid
      FROM keywords k1
      WHERE k1.name IN ('auto','haus','boot')
    )

    UNION

    /* direkte Treffer anhand der Keywords */
    SELECT k3.keywordid
    FROM keywords k3
    WHERE k3.name IN ('auto','haus','boot')

  )
Dies setzt voraus, dass der Server solche Syntax unterstützt.
Testen kannst Du selber. Kann sein, dass ich da irgendwas übersehen
habe.

Gääähn...Sch.. schon so spät? :bahnhof::oops::gaen:
 

krey

Aktives Mitglied
Wie genau weiß ich jetzt nicht, aber es ist mit oracle möglich die Rekursion Datenbankintern aufzulösen und das recht schnell. Beim verbinden musst du irgendwas ändern. Wie genau dass jetzt klappte weiß ich auch nicht mehr. Schau einfach mal in die Oracle Manual

Grüße,
Martin
 

m@nu

Bekanntes Mitglied
hey super! vielen dank! ... hatte seit der schule mit SQL nicht mehr so viel zu tun...
hab zuerst schon gedacht ich könnte die syntax mit HSQLDB vergessen, aber funktioniert alles tadellos :-D

nochmals danke & gruss
m@nu
 

m@nu

Bekanntes Mitglied
hm, ne, funktioniert leider doch nicht :(
hab mal gegoogelt... scheinbar kann HSQLDB das genze wirklich nicht... hab auch keine startparameter oder ähnliches gefunden...

hm, naja, dann muss ich wohl oder übel den WHERE-string java-seitig generieren... :oops:
 

m@nu

Bekanntes Mitglied
@bleiglanz: hmm, das scheint interessant zu sein... thx!
wenn du sagst bei "kleineren tabellen" ... alles unter 100 records (wirds bei mir eher sein) oder alles unter 100'000 records? ;)
 

Bleiglanz

Gesperrter Benutzer
lieber 100, die menge machts aber nicht

bei nested sets musst du bei jeden Insert einen komplettupdate aller Zeilen machen, man kann das also nur bei sehr kleinen oder solchen, bei denen nur selten eingefügt wird machen
 

m@nu

Bekanntes Mitglied
habs jetzt doch mit einer rekursiven methode auf der java-seite gelöst... scheint mit HSQLDB leider einfach nicht zu wollen.

trotzdem viele dank für eure hilfe & anregungen! kann ich (wenn ich mal auf einem anderen DB-server arbeite ;) ) sicher gut gebrauchen!

greetz
m@nu
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen


Oben