Question

Disons que j'ai un FirstName> MiddleName> hiérarchie LastName (~ lignes de 10k, pour l'amour de la question). Cela signifie que vous pourriez avoir "John> Mary-Anne> Eddy" ou "Eddy> John> Jacob" ligne. Le point étant que la hiérarchie n'a guère de sens et est très étrangère à l'utilisateur (contrairement, par exemple, un pays> État> Structure de la ville).

Parce que si son non structuré et confus, je veux fournir à l'utilisateur une zone de saisie automatique complète. Comme ils tapent, il faut rechercher des correspondances possibles de sous-chaîne, et quand ils « root » leur chaîne de recherche à un niveau, il sera alors limiter les résultats au-dessous de ce niveau.

Maintenant, parce qu'il ya beaucoup de personnes nommées « John », il fait peu de sens que si on tape « John » ils ne reçoivent que des résultats comme

  • John> Allen> Alexander
  • John> Allen> Burschawitz
  • John> Allen ... répéter 100 fois ...

Parce qu'ils ne verront jamais la ligne unique "Jason> John> Smith".

, ils devraient retourner quelque chose comme ( « * » est juste un indicateur arbitraire à l'utilisateur de « hey, beaucoup plus de lignes ci-dessous ce exist ») Au lieu de cela:

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

S'ils tapent « John> Al », puis les résultats seront limités à quoi que ce soit sous « John> », mais devraient être regroupés de façon similaire ci-dessus.

J'espère que l'explication est claire. Les exigences sont un peu lâche. Juste ceux qui sont raisonnables pour qu'une personne peut chercher dans l'arbre et trouver ce qu'ils recherchent.

En ce moment, j'ai une SQL intéressante qui recherche le terme de recherche dans la ligne, les chiffres sur sa position, fait un peu substring'ing, bys groupe, et l'ordre de ce pour obtenir les résultats ci-dessus, mais ce ne pas exécuter assez bien .

Je suis en train de résoudre ce problème sur une pile typique de la lampe (sauf avec Oracle). Ce ne est pas partagé d'hébergement, donc je ne le contrôle total sur le serveur. Les données changent de petites quantités toutes les quelques semaines, et les résultats de la recherche peut rester rassis pour un laps de temps raisonnable (par exemple, un cron qui met à jour l'index de recherche ne sont pas hors de question).

Était-ce utile?

La solution

Argh. Désolé, je ne pouvais pas décrire mon problème. Quoi qu'il en soit, voici la solution que je suis venu avec.

Fondamentalement, créer une seconde table de la table 3-colonne qui contient toutes les valeurs distinctes pour chaque niveau successif de la hiérarchie, ainsi qu'une colonne pour indiquer la profondeur de cette rangée dans la hiérarchie.

par exemple. De mytable(A, B, C), créez search_t(A, B, C, level)

Alors, avec "One> Deux> Trois", vous créez 3 lignes (A, B, C, niveau):

  • "One", null, null, 1
  • "One", "Deux", null, 2
  • "One", "Deux", "Trois", 3

Lors de la recherche, vous pouvez limiter le niveau en choisissant une valeur pour le niveau et fournissant des valeurs pour les colonnes de niveau supérieur:

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

Il peut être un peu simplifié et générique si vous créez une colonne de search_str et effectuer la mise en correspondance de LIKE contre cette place.

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

Avec le recul, cela aurait probablement été plus évident si les données étaient déjà dans un modèle liste de contiguïté.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top