0

FirstName > MiddleName > LastName 階層があるとしましょう (質問のために、最大 10k 行)。これは、「John > Mary-Anne > Eddy」または「Eddy > John > Jacob」の行を持つことができることを意味します。ポイントは、階層がほとんど意味をなさず、ユーザーにとって非常になじみがないことです (たとえば、[国] > [州] > [都市] 構造とは異なります)。

非常に構造化されておらず混乱しているため、ユーザーにオートコンプリート入力ボックスを提供したいと考えています。入力すると、可能な部分文字列の一致を検索する必要があり、検索文字列をあるレベルで「ルート化」すると、結果がそのレベルより下に制限されます。

さて、「John」という名前の人がたくさんいるので、「John」と入力しても次のような結果しか返されないというのはほとんど意味がありません。

  • ジョン > アレン > アレクサンダー
  • ジョン > アレン > バーシャウィッツ
  • ジョン > アレン ... 100 回繰り返す ...

一意の行 "Jason > John > Smith" が表示されないためです。

代わりに、次のようなものが返されるはずです (「*」は、「この下にさらに多くの行が存在する」というユーザーへの任意の指標にすぎません)。

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

「John > Al」と入力すると、結果は「John >」の下にあるものに限定されますが、上記と同様にグループ化する必要があります。

説明が明確であることを願っています。要件は少し緩いです。人がツリーを検索して自分が求めているものを見つけることができるように、合理的なものだけです。

現在、行内の検索語を検索し、その位置を把握し、部分文字列化、グループ化、および順序付けを行って上記の結果を取得する興味深い SQL がありますが、十分に機能していません。

私は、典型的な LAMP スタック (Oracle を除く) でこの問題を解決しようとしています。共有ホスティングではないため、サーバーを完全に制御できます。データは数週間ごとに少量ずつ変更され、検索結果は妥当な期間、古いままになる可能性があります (たとえば、検索インデックスを更新する cron は問題外ではありません)。

4

1 に答える 1

0

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

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

例:からmytable(A, B, C)、作成search_t(A, B, C, level)

したがって、「1> 2> 3」を使用して、3つの行(A、B、C、レベル)を作成します。

  • 「1つ」、null、null、1
  • 「1つ」、「2つ」、null、2
  • 「1つ」、「2つ」、「3つ」、3

検索時に、levelの値を選択し、上位レベルの列に値を指定することで、レベルを制約できます。

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%'

振り返ってみると、データがすでに隣接リストモデルに含まれている場合、これはおそらくより明白でした。

于 2009-04-09T03:02:51.600 に答える