2009-04-08 8 views
0

私は、FirstName> MiddleName> LastName階層(質問のために〜10k行)があるとします。つまり、「John> Mary-Anne> Eddy」または「Eddy> John> Jacob」行を持つことができます。要点は、階層がほとんど意味を持たず、ユーザーにとって非常に異質であるということです(たとえば、国>州>都市の構造)。3レベル階層の効率的な検索

このように構造化されておらず、混乱しているため、ユーザーに自動入力ボックスを提供したいと考えています。彼らがタイプするとき、可能性のある部分文字列一致を検索しなければなりません、そして、それらがあるレベルで彼らの検索文字列を "ルート"するとき、結果はそのレベルの下に結果を制限します。今

、「ジョン」という名前の人たちがたくさんあるので、それは彼らが「ジョン」と入力した場合、彼らは唯一のジョン>アレン

  • のような結果を取り戻すことはほとんど意味があります>アレクサンダー
  • ジョン>アレン> Burschawitz
  • ジョン>アレンは... 100回繰り返す...

彼らは一意の行 "ジェイソン>ジョン>スミス" を参照してくださいことは決してないだろうので。

代わりに、彼らは戻ってのような何かを得る必要があります(「*」「これが存在下記ちょっと、たくさんのより多くの行」のユーザーにだけ任意の指標である):

  • ジョン>アレン> *
  • は、
  • ジェイソン>ジョン>スミス
  • マイク>ジョン> *
  • メアリー>エレーナ> Johnason

彼らは "ジョン>アル" を入力すると、結果は次のようになります"John>"の下にあるものに限られますが、上記と同様にグループ化する必要があります。

説明が分かりやすいと思います。要件は少し緩いです。人がツリーを検索して後で何を見つけることができるように、ちょうど合理的なもの。

ここでは、行内の検索語を探してその位置を把握し、部分文字列を作成し、グループごとに並べ替えを行い、上記の結果を得るための順序付けを行う興味深いSQLがありますが、十分な。

私はこの問題を典型的なLAMPスタック(Oracleを除く)で解決しようとしています。共有ホスティングではないので、私はサーバーを完全に制御できます。データは数週間ごとに少量で変化し、検索結果は妥当な時間(例えば、検索インデックスを更新するクーロンは問題にならない)で陳腐化することがあります。

+0

私はあなたの何をしようとしているのか正確には分かりません。あなたがもっと分かりやすいかどうかわかりません。 – 108

+0

...おそらく、より良い類推:あなたがURLのリストを持っていて、 "com"を検索した場合、domain.com/a、domain.com/b、domain.com/bは不要です。あなたは単に "domain.com/"がほしいと思うでしょう。それ以降の結果は "other.org/Computers" –

+0

...かもしれません。あなたがdomain.com/a、/ b、/ cを望まない理由は、他の結果がプッシュされるこれまでのところ、上位10の結果には表示されませんでした。 –

答えて

0

申し訳ありませんが私の問題を説明することができませんでした。とにかく、ここに私が思いついた解決策があります。

基本的には、階層の各連続レベルのすべての個別値と階層内のその行の深さを示す列を含む3列テーブルから2番目のテーブルを作成します。

など。mytable(A, B, C)から、 "ワン>二>スリー" で、あなたは3行(A、B、C、レベル)を作成し、だから、search_t(A, B, C, level)

を作成します。

  • "ワン"、NULL、NULL、1
  • 「ワン」、「二」、ヌル、2
  • 「ワン」、「二」、「三」、3

検索、あなたはレベルの値を選ぶことによってレベルを制限することができますし、上位レベルの列に値を指定する:

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

あなたがsearch_str列を作成し、代わりにその反対LIKEマッチングを行う場合、それは少し簡略化して、一般的なことができます。振り返ってみると

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

データは隣接リストモデルにすでにあった場合、これはおそらくより明らかにされていると思います。

関連する問題