# Hirarchischer Filter



## m@nu (13. Sep 2005)

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.

```
+-----------+------------+--------+
| 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


----------



## Guest (14. Sep 2005)

Wie wäre es mit sowas? :shock:
	
	
	
	





```
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::gaen:


----------



## krey (14. Sep 2005)

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 (14. Sep 2005)

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 (14. Sep 2005)

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


----------



## Bleiglanz (14. Sep 2005)

google mal nach "Nested Set", ist bei kleineren Tabellen sehr praktisch


----------



## m@nu (14. Sep 2005)

@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 (14. Sep 2005)

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 (14. Sep 2005)

jop, hab ich bemerkt... (und da hakts bei mir auch schon  )

http://www.developersdex.com/gurus/articles/112.asp?Page=3
hier wird ein INSERT beschrieben... HSQLDB kennt die DECLARE anweisung aber scheinbar nicht 

ich krieg noch ne kriese! grml


----------



## m@nu (14. Sep 2005)

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


----------

