1

ワイルドカード検索を実行し、ワイルドカードの値を抽出して MySQL の結果に入れることは可能ですか? できれば、ワイルドカードにもラベルを付けたいと思います。私が何を意味するかを見るために読み続けてください。

例: 次の構造を持つデータベース テーブルを考えてみましょう。

+----+-------------------+
| id | content           |
+========================+
| 1  |  %1.%2.%3         |
+----+-------------------+
| 2  |  Hey %name.       |
+----+-------------------+

まず、これは単なる例であることに注意してください。単一のデータベース フィールドに複数の値を格納していません。ここを参照してください:データベース列に区切られたリストを保存するのは本当に悪いことですか?

代わりに、データベースにワイルドカードを使用できるかどうかを知り、それをユーザー入力と比較したいと考えています。言い換えれば、2.bla.^7または同様のユーザー入力を受け取り、そのそれぞれの行--%.%.%を返したいと思います。これらのワイルドカードを取り、MySQL の結果の一部として返したいと思います。mysql_fetch_assoc()以下は、私が探しているものに基づいたPHP の結果の例です。結果は明らかにこのように正確に配置する必要はありませんが、これ私が探している種類の結果です。

例:

/************************
 * Input:    2.bla.^7   *
 ************************/
Array
(
    [0] => Array
    (
        [id] => 1,
        [content] => %1.%2.%3
    ),

    [1] => Array
    (
        [1] => 2,
        [2] => bla,
        [3] => ^7
    )
)

/************************
 * Input:   Hey Matt.   *
 ************************/
Array
(
    [0] => Array
    (
        [id] => 2,
        [content] => Hey %1.
    ),

    [1] => Array
    (
        [name] => Matt
    )
)

私が探しているものは、かなり複雑であるか、私の固有のケースに特化している可能性が高いことを理解しています。あなたが私を正しい方向に向けることができれば、私はそれを大いに感謝します! これが可能かどうかさえわかりません。そうでない場合は、別の解決策をいただければ幸いです。ただし、データベース構造は可能な限り同じに近づけたいと考えています。

どうもありがとう!

4

2 に答える 2

2

あなたはやりたいだけではありませんか:

SELECT * FROM patterns WHERE 'user input' LIKE content;

sqlfiddleで参照してください。

于 2012-05-21T23:04:09.953 に答える
1

実際、すぐに使えるソリューションはありません。これが私がすることです:

like_pattern1) 3 つの特別な列を追加regexp_patternしますplaceholders。それらの値は、contentデータをテーブルにロードする前に PHP で、または BEFORE INSERT/UPDATE TRIGGER で列から計算されます。

  • like_pattern VARCHAR(N)- 逆検索のLIKEパターン
  • regexp_pattern VARCHAR(N)- PHP で後で部分を抽出するための正規表現パターン
  • placeholders VARCHAR(N)- プレースホルダー名のカンマ区切りリスト

次に例を示します。

+----+-------------+--------------+--------------------+--------------+
| id | content     | like_pattern | regexp_pattern     | placeholders |
+====+=============+==============+====================+==============+
| 1  |  %1.%2.%3   | %.%.%        | ^(.*)\.(.*)\.(.*)$ | 1,2,3        |
+----+-------------+--------------+-+------------------+--------------+
| 2  |  Hey %name. | Hey %.       | ^Hey (.*)\.$       | name         |
+----+-------------+--------------+--------------------+--------------+

2) を使用して特定の文字列検索レコードの場合like_pattern:

SELECT * FROM patterns WHERE 'Hey Nathanael.' LIKE like_pattern;

逆検索を実行するため、単純なインデックスではこのクエリを高速化できないことに注意してください。そのため、テーブルの大きさによっては、おそらく別のソリューションが必要になるでしょう。

3) 'Hey Nathanael' という文字列に一致します。regexp_patternPHP のpreg_match()orを使用して返されたに対してereg()。プレースホルダー値を取得します。

4) それらを列のプレースホルダー名と組み合わせますplaceholders

それでおしまい。

于 2012-05-26T04:03:11.970 に答える