forTeesSake Geschrieben 1. Februar 2006 Geschrieben 1. Februar 2006 hi und hallo. ich habe hier ein kleines CMS für einen kunden programmiert in dem er sich selbst seine seitenstruktur zusammenstellen kann. in der datenbank sieht dann seine seitentabelle folgendermassen aus: id idParent seitenName 1 0 Erste Seite 2 1 Zweite Seite (kind von id 1) 3 2 Dritte Seite (kind von id 2) 4 0 Vierte Seite ich möchte nun eine suchfunktion anbieten, die auch eine suche auf bestimmte "bereiche" der seite anbietet. d.h. in einem dropDown soll die gesamte seitenstruktur (bis zu einer bestimmten ebene) abgebildet werden und der benutzer wählt dann den bereich auf dem er seine suche beschränken will aus. die suche an sich über fulltext, mit AND und OR etc. ist überhaupt kein problem. vielmehr ist aber ein problem, dass ich nicht weiss wie ich mein SQL-statement aufbauen muss, damit ich in o.g. fall folgendes machen kann: - suchbegriff wird eingegeben z.b. "Seite" - begrenzung auf den bereich der "Ersten Seite" das bedeutet dass alle unterseiten der Ersten Seite gefunden werden müssen, da sie ja das Suchwort "Seite" im namen tragen. aber wie sieht das sql dann aus??? Select * WHERE MATCH (seitenName) AGAINST "Seite" AND idParent = 1 ist ja nicht richtig, da dann die Erste Seite und die Dritte Seite fehlen. ich bin schon am überlegen ob man das rekursiv lösen muss, aber komme im moment nicht wirklich drauf. oder: ist die gesamte tabellenstruktur in der form dafür vielleicht völlig ungeeignet? vielen dank Zitieren
baba007 Geschrieben 1. Februar 2006 Geschrieben 1. Februar 2006 die Tabellenstruktur ist a la Nested Sets aufgebaut und ist bei häufigem betrachten und nicht schreiben sehr performant. leider hast du da aber einige Fehler den die nummerierung würde so aussehen : id idParent seitenName 1 6 Erste Seite 2 5 Zweite Seite (kind von id 1) 3 4 Dritte Seite (kind von id 2) 1 2 Vierte Seite [/PHP] und dann gehst du über den ersten treffer bei ID 1 .... mit limit 0,1 oder top 1 je nach DB Zitieren
forTeesSake Geschrieben 1. Februar 2006 Autor Geschrieben 1. Februar 2006 hi baba. das verstehe ich nicht. kannst du mir deine idParent nummerierung genauer erklären? wo steht denn bei dir, dass die seite mit der id=2 das kind der seite mit der id=1 ist. genauso die anderen. denn die struktur ist ja folgende die zahlen für die seiten ebenen 1 Erste Seite 2 Zweite Seite 2 Dritte Seite 1 Vierte Seite Zitieren
baba007 Geschrieben 1. Februar 2006 Geschrieben 1. Februar 2006 die idee ist ja, dass jeder zweig in sich geschlossen ist. damit du, falls du nur einen Zweig betrachtest, nur diesen selektierst und die anderen in ruhe lässt. zum beispiel ein forumthread. Arne Klempert hat das hier wunderbar erklärt. Sehr lesenswert, allerdings nicht so einfach in der umsetzung und vor allem bei inserts sehr anspruchsvoll Zitieren
forTeesSake Geschrieben 1. Februar 2006 Autor Geschrieben 1. Februar 2006 oki. das schau ich mir mal an und melde mich wenns weiterhin probleme gibt. angst habe ich echt davor meine gesamte "insert" programmierung umstellen zu müssen. das wäre sehr zeitaufwendig. sollte jemand noch ne lösung haben wie es unter umständen auch noch geht wäre ich sehr glücklich. danke baba für die schnelle antwort und den linktipp! Zitieren
baba007 Geschrieben 1. Februar 2006 Geschrieben 1. Februar 2006 ein Insert ist relativ einfach, allerdings zieht ein insert meist mächtig viele updates nach sich und, das habe ich vergessen, die id ist natürlich nicht mehr dein PK. dazu brauchst du dann noch ein ROWID(PK) Zitieren
forTeesSake Geschrieben 1. Februar 2006 Autor Geschrieben 1. Februar 2006 k. dass es viele updates gibt ist in diesem fall irrelevant, da die seiten nur vom admin angelegt und bearbeitet werden. und das kann meinetwegen schon auchmal ein bisschen dauern. ausserdem ändern sich seitenzuordnungen nahezu gar nicht. das passt schon. ich hab mal die vorgeschlagenen artikel gelesen und finde sie sehr informativ. ich werde das ganze aber auf das nächste projekt verschieben, da leider die zeit für die vollständige umstellung bei diesem projekt fehlt. ABER: ich habe noch einen (etwas dirty) workaround gefunden: nach dem anlegen bzw. update einer seite werden in ein datenbankfeld namens "allParents" der seite einfach alle parents bis toplevel mit komma separiert eingetragen. bei der sql suche verwende ich dann einfach ein "WHERE suchID in (1,4,5)" die werte in klammern entsprechen dem feldWert von allParents wie gesagt: nicht besonders hübsch, aber auf jeden fall praktikabel soweit ich das sehe. viele grüße Zitieren
forTeesSake Geschrieben 1. Februar 2006 Autor Geschrieben 1. Februar 2006 es war nicht ganz richtig, aber nun habe ich es. die where klausel muss heissen: WHERE FIND_IN_SET(idParent, allParents) ich bin so froh ich könnte die welt umarmen. :bimei Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.