例のクエリは、あなたのMySQLを使用して、指定された結果セットを取得しますが、それは本当に「ファジーマッチング」を行いません。アルゴリズム。 (これはあなたが記述するアルゴリズム実装 - 値によってソートし、次に先頭部分「マッチ」以前に取得した値かどうかを確認するために各値を確認する)
これは、リーディング部分の「完全一致」を見つけます以前に検索された行からの値に対する近傍値のうち、実際に一致についての「あいまいさ」はありません。
"不一致"の値をクエリが検出すると、その値は "不一致"とマークされます。取り出された次の値に対して、その値が前回の "不一致"値で始まるかどうかがチェックされます。文字列の先頭部分が完全一致の場合、値は破棄されます。それ以外の場合、値は「不一致」値としてマークされ、保持されます。
このアプローチでは、インラインビュー(またはMySQLが参照する「派生テーブル」)を使用します。最も内側のインラインビュー(sのエイリアス)は、近傍の異なる値の並べ替えられたリストを取得します。 「トリック」(それを呼びたい場合)は、以前に取得した値を参照するためにMySQLユーザ変数を使用する次のインラインビュー(別名「t」)にあります。
「特殊文字」の問題を避けるために、先頭の文字を等価比較します。
は、ここで全体のクエリです:
SELECT t.neighborhood
FROM (
SELECT IF(IFNULL(LEFT(s.neighborhood,CHAR_LENGTH(@match)) <> @match,1),@match := s.neighborhood,NULL) AS neighborhood
FROM (SELECT RTRIM(neighborhood) AS neighborhood
FROM mytable
JOIN (SELECT @match := NULL) r
GROUP BY neighborhood
ORDER BY neighborhood
) s
) t
WHERE t.neighborhood IS NOT NULL
それは@match変数の初期化、および以前の値に現在の値の比較を行い、表現を除いて、すべて本当に非常に簡単です。
我々は値に特殊文字によって導入されたコーナーケースと心配していない場合、我々は比較を行うために単純なLIKEまたはREGEXPを使用することができます。
s.neighborhood NOT LIKE CONCAT(@match,'%')
s.neighborhood NOT REGEXP CONCAT('^',@match)
LIKE演算子は、アンダースコアの対象となりますパーセント文字の場合、REGEXPは正規表現で使用される特殊文字の影響を受けます。
LEFT(s.neighborhood,CHAR_LENGTH(@match)) <> @match
何それは前の値を取ってやっている(例えば@match::=「パークビュー」)とすることを比較し、それらの問題を回避するには、クエリは、上記もう少し探して扱いにくいです比較を使用しています次の値のリーディング部分(「パークビュー」の長さまで)が一致するかどうかを判断します。このクエリでのアプローチの
1つの利点は、返される値は、後続のクエリ内の述語にTP「一致」を保証されているということです。このクエリを使用して近隣のリストを取得しており、ユーザーが選択したとします。これは、各行に「一致」する値のセットを返すことになります。
次の問合せでは、単純述語(WHERE句)の戻り値のいずれかを使用して一致する行を戻すことができます。ユーザーが値「大湖」を選択している場合たとえば、:我々は一致するLIKEまたはREGEXP述語を使用する場合には
SELECT t.*
FROM mytable t
WHERE LEFT(t.neighborhood,CHAR_LENGTH('Great Lake') = 'Great Lake'
を、我々は述語に対応するマッチを使用したいと思いますその後のクエリ:
SELECT t.*
FROM mytable t
WHERE t.neighborhood LIKE CONCAT('Great Lake','%')
SELECT t.*
FROM mytable t
WHERE t.neighborhood REGEXP CONCAT('^','Great Lake')
あなたの質問に必要な出力を追加して理解を深めることはできますか? – heretolearn
"Sub X"は最後にある唯一の文字列か、そのテキスト変数ですか? –
@sshekhar: "' 'Park View ''と 'Great Lake' 'のみを返します。" - これは予想される出力です。 – Travesty3