-1

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

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

此列有字符,也有连字符、逗号、括号、句点或空格中的一个或多个。

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

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

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

Annotationscolumn 包含字符A-Zora-z和一个或多个连字符、逗号、空格或括号,如下所示。

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

列中的示例数据Annotations

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

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

我尝试使用LIKEREGEX但它也没有工作。

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

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

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

4

3 回答 3

1

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

将 REGEXP 与正确的正则表达式一起使用:

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

如果 mysql 支持正则表达式向前看,这可以在一次测试中完成。,

于 2013-08-12T20:22:26.933 回答
0

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

REGEXP 使用正则表达式,它具有非常特殊的语法。LIKE 使用带有关键字符的简单文本替换,例如%or_

在这里,您将 REGEXP 与 % 一起使用,这就是它不起作用的原因。%是 LIKE 的关键字符。但在 REGEXP 中,.-是您需要转义的特殊字符。

如果你想检查几个字符,REGEXP 是要走的路:

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

这场比赛:

  • .* : 0 到 n 个字符
  • $Annotation : 你的关键字
  • .* : 0 到 n 个字符
  • [\-(),\.]+ :列表中至少 1 个字符: - ( ) , .
  • .* : 0 到 n 个字符

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

于 2013-08-12T20:01:45.417 回答
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 必须一遍又一遍地遍历数据库中的每条记录以获得结果。

全文搜索选项

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

ALTER TABLE oats ADD FULLTEXT(Annotations);

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

Sequence FROM oats WHERE
Foldchange = '$Foldchange'
AND RustvsMockPvalue = '$RustvsMockpvalue'
MATCH(Annotations) AGAINST ('ADP ANT')
于 2013-08-12T21:35:27.547 回答