0

文字列のある非常に大きなテーブルがあります。フィールド「単語」:

- dog
- champion
- cat
- this is a cat
- pool
- champ
- boots
...

私の例では、選択クエリが特定の文字列「チャンピオンシップ」を探している場合、この文字列がテーブルにないため、検索されません。その場合、テーブルから「champion」、つまり、指定された単語「championship」で始まるテーブル内の最長の文字列を返すクエリが必要です。可能な一致 (見つかった場合) は、チャンピオンシップ、またはチャンピオンシ、またはチャンピオンシ、またはチャンピオン、...、またはチャム、またはチャ、または ch、または C の間のテーブルで最も長いものです。

質問: 特定の文字列を開始する、テーブル内の最長の文字列を返したいです。
高速が必要です。クエリを高速に実行するためにインデックスとクエリを作成する方法はありますか?

4

3 に答える 3

0

この記事を見てください:

http://blog.fatalmind.com/2010/09/29/finding-the-best-match-with-a-top-n-query/

このSOの質問からの解決策を説明しています:

mysqlクエリで効率的にインデックスを使用する方法

ソリューション パターンは次のようになります。

select words
  from (
        select words
          from yourtable
         where words <= 'championship'
         order by words desc
         limit 1
       ) tmp
 where 'championship' like concat (words, '%')
于 2013-08-12T06:13:55.537 に答える
0

あなたは「与えられた単語「チャンピオンシップ」を開始する表の中で最も長い文字列」について少し曖昧です。「優勝」は試合としてカウントされますか?

おそらく、以下が役立つでしょう。にインデックスがある場合words、次は指定された単語の前の最後の単語を返します。一致の最初のシーケンスを最大化する必要があります。

select word
from t
where words <= 'championship'
order by words desc
limit 1;

これはまさにあなたが求めているものではありませんが、実際にはうまくいくかもしれません。

編集:

完全一致を探している場合は、次のように単語のインデックスを効果的に使用して、必要なものを返す必要があります。

select word
from t
where word in ('championship', 'championshi', 'championsh', 'champions', 'champion',
               'champio', 'champi', 'champ', 'cham', 'cha', 'ch', 'c')
order by word desc
limit 1;

少し強引ですが、インデックスを使用してクエリを高速化するというプロパティが必要です。

于 2013-08-11T23:27:26.573 に答える
0

指定された結果を返す 1 つのクエリを次に示します。

SELECT t.mycol
  FROM mytable t 
 WHERE 'championship' LIKE CONCAT(t.mycol,'%')
 ORDER
    BY LENGTH(t.mycol) DESC
 LIMIT 1

このクエリはインデックス レンジ スキャンを実行できません。フル スキャンを実行する必要がありますが、インデックスを使用してクエリを満たすことができる場合があります。

「ヒット」と見なすために一致する必要がある有限数の先頭文字に検索を制限できる場合は、別の述語を含めることができます。たとえば、少なくとも 4 文字を一致させるには、次のようにします。

SELECT t.mycol
  FROM mytable t 
 WHERE 'championship' LIKE CONCAT(t.mycol,'%')
   AND t.mycol LIKE 'cham%'
 ORDER
    BY LENGTH(t.mycol) DESC
 LIMIT 1

- また -

  AND t.mycol >= 'cham' 
  AND t.mycol <  'chan'
于 2013-08-11T23:29:03.253 に答える