FirstName > MiddleName > LastName 階層があるとしましょう (質問のために、最大 10k 行)。これは、「John > Mary-Anne > Eddy」または「Eddy > John > Jacob」の行を持つことができることを意味します。ポイントは、階層がほとんど意味をなさず、ユーザーにとって非常になじみがないことです (たとえば、[国] > [州] > [都市] 構造とは異なります)。
非常に構造化されておらず混乱しているため、ユーザーにオートコンプリート入力ボックスを提供したいと考えています。入力すると、可能な部分文字列の一致を検索する必要があり、検索文字列をあるレベルで「ルート化」すると、結果がそのレベルより下に制限されます。
さて、「John」という名前の人がたくさんいるので、「John」と入力しても次のような結果しか返されないというのはほとんど意味がありません。
- ジョン > アレン > アレクサンダー
- ジョン > アレン > バーシャウィッツ
- ジョン > アレン ... 100 回繰り返す ...
一意の行 "Jason > John > Smith" が表示されないためです。
代わりに、次のようなものが返されるはずです (「*」は、「この下にさらに多くの行が存在する」というユーザーへの任意の指標にすぎません)。
- ジョン > アレン > *
- ジェイソン > ジョン > スミス
- マイク > ジョン > *
- メアリー > エレナ > ジョナソン
「John > Al」と入力すると、結果は「John >」の下にあるものに限定されますが、上記と同様にグループ化する必要があります。
説明が明確であることを願っています。要件は少し緩いです。人がツリーを検索して自分が求めているものを見つけることができるように、合理的なものだけです。
現在、行内の検索語を検索し、その位置を把握し、部分文字列化、グループ化、および順序付けを行って上記の結果を取得する興味深い SQL がありますが、十分に機能していません。
私は、典型的な LAMP スタック (Oracle を除く) でこの問題を解決しようとしています。共有ホスティングではないため、サーバーを完全に制御できます。データは数週間ごとに少量ずつ変更され、検索結果は妥当な期間、古いままになる可能性があります (たとえば、検索インデックスを更新する cron は問題外ではありません)。