2012-09-20 50 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