-1

私の質問を読んでくれてありがとう。

MySQLテーブル、HTMLフォーム、およびフォームをMySQLテーブルに接続し、データ型Annotationsである列のシーケンスを取得するPHPのプログラムを作成しました。text

この列には文字があり、ハイフン、カンマ、括弧、ピリオド、またはスペースが 1 つ以上含まれています。

選択クエリに使用した次のコードを見てください。

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

$Annotationユーザーがフォームに入力した値を保持するフォーム変数を次に示します。AnnotationsMySQL テーブルの列名です。

Annotations列には、次のような文字A-Zまたはa-zハイフン、コンマ、スペース、または括弧が 1 つ以上含まれています。

Sequenceは MySQL テーブルの別のtext列ですが、 はありません,./()

Annotations列のデータ例:

ADP、ATP キャリア タンパク質、ミトコンドリア前駆体 (ADP/ATP トランスロカーゼ) (アデニン ヌクレオチド トランスロケーター) (ANT)。

Annotationsコンマ、括弧、ピリオド、およびスラッシュを使用して列データを検索すると、シーケンス列データを取得できません。これらを持たないレコードでは問題なく機能します,.()/

LIKE代わりに使用しようとしましREGEXたが、どちらも機能しませんでした。

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 が正規表現の先読みをサポートしている場合、これは 1 回のテストで実行できます。、

于 2013-08-12T20:22:26.933 に答える
0

まず、REGEXP を適切に使用していません。LIKE と REGEXP の違いを確認する必要があります。

REGEXP は、非常に特殊な構文を持つ正規表現を使用します。LIKE%またはのようなキー文字で単純なテキスト置換を使用します_

ここでは % で 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 が結果を得るためにデータベース内のすべてのレコードを何度も実行する必要があるため、これはますます遅くなります。

全文検索オプション

これを行う可能性のある別の方法は、データベースのテーブルの注釈フィールドで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 に答える