选择查询以检索带有连字符,逗号,句点和括号的文本列

时间:2013-08-12 19:40:11

标签: php mysql regex

感谢您花时间阅读我的问题。

我在PHP中创建了一个MySQL表,一个HTML表单和一个程序,它将表单连接到MySQL表并检索Annotations列为text数据类型的列的序列。

此列包含字符,并且还包含连字符,逗号,括号,句点或空格中的一个或多个。

请查看以下用于选择查询的代码:

$values=mysql_query("SELECT Sequence 
                       FROM oats 
                      WHERE Foldchange = '$Foldchange' AND 
                            RustvsMockPvalue = '$RustvsMockpvalue' AND 
                            Annotations REGEXP '%$Annotation%[-]+'");

此处$Annotation是表单变量,用于保存用户在表单中输入的值。 Annotations是MySQL表中的列名。

Annotations列包含字符A-Za-z以及一个或多个连字符,逗号,空格或括号,如下所示。

Sequence是MySQL表格中的另一个text列,但没有,./()

来自Annotations列的示例数据:

  

ADP,ATP载体蛋白,线粒体前体(ADP / ATP转位酶)(腺嘌呤核苷酸转运蛋白)(ANT)。

当我使用逗号,括​​号,句点和斜杠搜索任何Annotations列数据时,我无法检索序列列数据。它适用于那些没有这些,.()/的记录。

我尝试使用LIKE代替REGEX,但它也不起作用。

来自mysql表的记录:(你在下面看到的列:contigid,source,genelength,rustmeans,mockmeans,foldchange,pvalue,rustmockteststatistic,Annotations and Sequence)

as_rcr_contig_10002 ORME1 2101 506.33 191 -2.18 2.21E-10 -6.35 Tesmin / TSO1样,含CXC结构域的蛋白质。 AACAATTCCCCTCAACCAACCTTTTATTTCATCCCATTTTTATCATCTGTCCGGTTACAGATTTTGCTTCCAGTTAGGTGCCACTTCTTCAAACGCTCAACCCTTACCCACTACCACCCCACCAAAACCAACCCCCCAAGATGCAGTTCATCACTCTCGCCGTTGCTTTTGCTTTCTTTGCTGGTGCCANNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCTTTTGCTTTCTTTGCTGGTGCCACCTCGTCGCCGGTTTCCATGGACCCCAAAGCCGAGAAGTCCGGCTCCTCGGGATCCGGTGGCGCCCCTCTGGGCACTGCTAGCCCCTATCCCCAAAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGTGGCCCTCAGTCGCCAGGCTCTGGCCAACCCGGTAGGATGCCATGGGGTAGCGACCAATCTGCCTACGGTGGTGGTTTCCCTTATGGATCATTCCCCTCGGTTTCGGGGCAATCCCAATCGACGGCCTATGCTCAAGCTCAATCATCCAGTTTCCCCTCAAACGGTGTCCCGACACACTCCTCGGCCTCCGCCCAAGCGCAATCATCCGGTCCTGGACAAGCTCAGGCAGCCGCTTCTGCCCAGGTTCCCGGCGGCCCCCACGGTCAAGGTTCTAACGGATTTGGCGCACAAGGCCAGTTTGGACAGAACGGGCAGAACGGCCTCTATGGTCAAGACGGCAATGGCTTTAGTGCCCAAGGCCAATTTGGACAGAGTGGACAGAATGGCTTCTATGGTCA

有人可以帮助我使用SELECT语法的正确语法吗?谢谢。

3 个答案:

答案 0 :(得分:1)

你需要熟悉正则表达式 - 这是它自己的语言。

使用正确的正则表达式使用REGEXP:

WHERE ...
AND Annotations REGEXP '[-A-Za-z(). ]+'
AND Annotations NOT_REGEXP '[A-Za-z]+'

如果mysql支持正则表达式,那么可以在一次测试中完成。 ,

答案 1 :(得分:0)

首先,您没有正确使用REGEXP。 您应该检查LIKE和REGEXP之间的差异。

REGEXP使用Regular expresions,它具有非常特殊的语法。 LIKE使用简单的文本重新加入与%_

等关键字符

这里使用REGEXP和%,这就是为什么它不起作用。 %仅是LIKE的关键字符。 但在REGEXP中,.-是您需要转义的特殊字符。

如果你想检查几个字符,可以选择REGEXP:

Annotations REGEXP '.*$Annotation.*[\-(),\.]+.*'

这场比赛:

  • 。*:0到n个字符
  • $注释:您的关键字
  • 。*:0到n个字符
  • [\ - (),\。] +:列表中至少有一个字符: - (),.
  • 。*:0到n个字符

告诉我们这是否符合您的数据。

答案 2 :(得分:0)

因为我们无法制作一个可以在你的情况下工作的正则表达式而没有进入一些疯狂的匹配方案(订单等等),为了找到你正在寻找的东西,你需要自定义构造SQL语句,幸运的是你正在使用PHP。

这里我从一个简单的空格分隔入口开始。请记住,您不能用括号括起内容,因为括号可能在结果集中不匹配。

$search_input = 'ADP ANT'; 

//example of array from a search page full of check boxes or fields
$annSearches = explode(' ',$search_input);

/*annSearches is now and array with ADP,ANT*/


$sql = "SELECT Sequence FROM oats WHERE Foldchange = '$Foldchange' AND RustvsMockPvalue = '$RustvsMockpvalue'";

foreach ($annSearches as $Annotation){
    $sql .= " AND Annotations LIKE '%$Annotation%'";
}

输出SQL语句看起来像这样(为清晰起见而包装):

SELECT Sequence FROM oats WHERE
Foldchange = '$Foldchange'
AND RustvsMockPvalue = '$RustvsMockpvalue'
AND Annotations LIKE '%ADP%'
AND Annotations LIKE '%ANT%';

如果你进行了很长时间的查询,这将变得越来越慢,因为MySQL必须反复遍历数据库中的每条记录才能获得结果。

FULLTEXT搜索选项

您可能执行此操作的另一种方法是在数据库的表中的Annotations字段上启用FULLTEXT search功能。

ALTER TABLE oats ADD FULLTEXT(Annotations);

这将允许您进行如下搜索:

Sequence FROM oats WHERE
Foldchange = '$Foldchange'
AND RustvsMockPvalue = '$RustvsMockpvalue'
MATCH(Annotations) AGAINST ('ADP ANT')