Frage

Lassen Sie uns sagen ich ein Vorname haben> Middle> Name VZ Hierarchie (~ 10k Zeilen, aus Gründen der Frage). Das heißt, Sie könnten "John> Mary-Anne> Eddy" oder "Eddy> John> Jacob" Reihe. Der Punkt ist, dass die Hierarchie wenig Sinn macht, und ist sehr fremd für den Benutzer (im Gegensatz zu, sagen wir, ein Land> Staat> Stadtstruktur).

Weil sein so unstrukturiert und verwirrt, ich den Benutzer mit einem Auto-Vervollständigen-Eingabefeld zur Verfügung stellen mag. Als sie geben, sollte es für möglich Teilzeichenfolge Matches suchen, und wenn sie „root“ ihr Suchtext auf einem Niveau, wird es dann die Ergebnisse einschränken unter diesem Niveau.

Nun, weil es viele Leute den Namen „John“ sind, macht es wenig Sinn, wenn sie „John“ geben nur sie zurück Ergebnisse wie

erhalten
  • John> Allen> Alexander
  • John> Allen> Burschawitz
  • John> Allen ... wiederholen 100mal ...

Weil sie nie die einzigartige Reihe "Jason> John> Smith" sehen.

Stattdessen sollten sie wieder so etwas wie ( „*“ ist nur ein beliebiger Indikator für den Benutzer von „hey, viel mehr Zeilen unterhalb diesem exist“):

  • John> Allen> *
  • Jason> John> Smith
  • Mike> John> *
  • Mary> Elena> Johnason

Wenn sie würden geben „John> Al“ und dann die Ergebnisse auf etwas unter beschränken „John>“, sollte aber ähnlich wie oben gruppiert werden.

Ich hoffe, die Erklärung klar ist. Die Anforderungen sind ein bisschen locker. Nur Vernünftigen so, dass eine Person durch den Baum suchen und finden, was sie sind nach.

Im Moment ich einige interessante SQL haben, die für den Suchbegriff in der Reihe sieht, Zahlen seine Position aus, hat einige substring'ing, Gruppe bys, und um durch die die obigen Ergebnisse zu bekommen, aber es ist nicht gut abschneiden genug .

Ich versuche, dieses Problem auf einem typischen LAMP-Stack zu lösen (außer bei Oracle). Es ist nicht Shared Hosting, so dass ich die volle Kontrolle über den Server. Die Daten ändert geringe Mengen alle paar Wochen, und die Suchergebnisse können abgestanden bleiben für einen angemessenen Zeitraum (beispielsweise ein cron, die aktualisiert den Suchindex ist nicht außer Frage).

War es hilfreich?

Lösung

Argh. Leider war ich nicht in der Lage, mein Problem zu beschreiben. Wie auch immer, hier ist die Lösung kam ich mit.

Grundsätzlich erstellen eine zweite Tabelle aus der 3-Spaltentabelle, die all unterschiedlichen Werte für jede folgende Ebene der Hierarchie enthält, sowie eine Säule, um anzuzeigen, die Tiefe dieser Zeile in der Hierarchie.

z. Von mytable(A, B, C) erstellen search_t(A, B, C, level)

Also, mit "One> Two> Three", erstellen Sie drei Reihen (A, B, C, Stufe):

  • "One", null, null, 1
  • "One", "Two", null, 2
  • "One", "Two", "Three", 3

Bei der Suche können Sie die Ebene einschränken, indem Sie einen Wert für Ebene kommissioniert und Werte für die obere Ebene Spalt bereitstellt:

WHERE A='One' and level > 1 and (B like '%t%' or C like '%t')

Es kann ein wenig vereinfacht und generic, wenn Sie eine search_str Spalte erstellen und die LIKE Anpassung führen dagegen statt.

WHERE A='One' and level > 1 and search_str like '%t%'

Im Nachhinein wäre dies wahrscheinlich deutlicher gewesen, wenn die Daten bereits in einem adjacency-Liste Modell.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top