2012-09-20 79 views
0

我有一個LONGTEXT列,用於存儲段落的文本。比方說,這些段落中有一些這樣的:MySQL比較查詢長文本列

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

有沒有可能做一個對比查詢小串「數:75」的所有文本的?

我首先想到的是像

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

這甚至可能嗎?

+0

是的,使用'like'總是可以的,即使你只想用一列搜索,你也可以在這裏看看:http://dev.mysql.com/doc/refman/ 5.1/EN /全文 - 自然語言。HTML和閱讀關於布爾全文搜索也) – Najzero

+0

@Najzero:我認爲OP想要結合全文比較和全文內容的定性檢查,在這種情況下,LIKE不會削減它。 – davek

回答

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

爲在您的處置功能。

+0

謝謝你的所有輸入。 – Norse

+0

your're welcome! – davek