Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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!

Geschrieben

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)

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...