1

LONGTEXTテキストの段落を保存するために使用する列があります。これらの段落内に次のようなものがあるとしましょう。

Text text text text
COUNT: 75  text text
 text text text text
 text text text text

そのすべてのテキストから小さな文字列「COUNT: 75」を比較クエリすることは可能でしょうか?

私の最初の考えは次のようなものでした

SELECT * FROM `books`
WHERE `paragraphs` LIKE '%COUNT: >0%'

これは可能ですか?

4

1 に答える 1

1

SELECTテキストにワイルドカード文字間のビットが含まれている行のみが見つかりますLIKE。そのような比較ロジックとを組み合わせることはできません。

ただし、できることは、正規表現を使用してテキストの関連セクションを取り除き、それを分析することです。

ただし、その組み合わせを覚えておいてください

  • 大量のテキスト
  • テキストコンテンツロジック
  • 正規表現

一度に最高のパフォーマンスを提供することはできません!私は次のことを提案します:

  1. トリガーを使用してテキストのサブセクションを削除し、管理しやすいもの(つまり、50文字程度)を使用できるようにして、このサブテキストを別のテーブルに挿入します
  2. MySql正規表現またはフルテキスト関数を使用してCOUNTを分析します

したがって、トリガーは次のようになります。

select 
ltrim(rtrim(substring(paragraphs, instr(paragraphs, 'count:') + 6, 10)))
from books 
where instr(paragraphs, 'count:') > 0

'count:'これにより、空白が削除された後、次の10文字が取得されます。次に、たとえば、それをさらに洗練することができます

select substring(text_snippet, 1, instr(text_snippet, ' ')) as count_value
from
(
    select 
    ltrim(rtrim(substring(paragraphs, instr(paragraphs, 'count:') + 6, 10))) 
          as text_snippet
    from books 
    where instr(paragraphs, 'count:') > 0
) x
where isnumeric(substring(text_snippet, 1, instr(text_snippet, ' '))) = 1

数値がCOUNTビットの後に続く行を取得します。

次に、COUNTの横にある数値を抽出し、それらを数値として別のテーブルに保存してから、次のようにJOINを使用できます。

select b.*
from books b inner join books_count_values v
on b.id = v.books_id
where v.count_value > 0

こちらをご覧ください

http://dev.mysql.com/doc/refman/5.1/en/string-functions.html

あなたの処分で機能のために。

于 2012-09-20T06:14:47.340 に答える