4

これを読んでくれてありがとう。あなたが私を助けてくれることを願っています。

これらの行の値を持つ Mysql テーブルがある場合

id| 検索
========
1| 蝶
2| アメリカ
3| アメリカの鳥
4| アメリカの蝶

検索語の数や順序に関係なく、文字列「アメリカの蝶」で発生する「検索」列のすべての単語がどの行にあるかを確認するにはどうすればよいですか。

(この例では 1、2、4 を取得したいと思います) コード化されたループを使用してこの問題を解決しています。全文検索と正規表現を試しましたが、完全に動かなくなりました。送信。

4

3 に答える 3

1

ネストされた置換、サブクエリなし。

SELECT id, search
FROM  a 
WHERE LENGTH( TRIM( 
REPLACE( REPLACE( REPLACE( 
CONCAT(  ' ', search,  ' ' ) ,  
' butterflies ',  ' ' ) ,  ' of ',  ' ' ) ,  ' america ',  ' ' ) ) ) = 0

        id  search
        1   butterflies
        2   america
        4   america butterflies

検索する単語にブックエンド スペースを追加して、単語の途中で一致しないようにしました (例: 「コーヒー」の「の」)。searchさらに、最初と最後の単語を説明するために、フレーズにスペース ブックエンドを追加しました。

于 2010-11-10T17:11:23.390 に答える
0
SELECT * 
FROM table_name 
WHERE search LIKE '%butterflies%' 
  AND search LIKE '%of%' 
  AND search LIKE '%america%';

or

SELECT * 
FROM table_name 
WHERE search REGEXP 'butterflies|of|america'; // not working

If i am not missing something :)

Edit: I was missing something :(

于 2010-10-22T13:43:56.743 に答える
0

以下は、私が試した方法の 1 つです (あまり効率的ではありませんが)。

select search, replace(filtered, 'butterflies', '') as filtered from (
   select search, replace(filtered, 'of', '') as filtered from (
      select search, replace(search, 'america', '') as filtered from table_name a
   ) b
) c;

このクエリは、次のようなものを提供します。

+---------------------+----------+
| search              | filtered |
+---------------------+----------+
| butterflies         |          |
| america             |          |
| birds of america    | birds    |
| america butterflies |          |
+---------------------+----------+

ただし、これを機能させるための最後の部分は、私にいくつかの問題を引き起こしました...「空」のすべての行を返す(つまり、空白文字のみを含む) where 句が必要です。

これにより、3 行目が除外され、目的の結果セットが返されます。ただし、trim() を使用してこれを機能させることができませんでした。その理由はわかりません。

たとえば、私は試しました:

where length(trim(c.filtered)) = 0;

これにより、必要な結果セットが得られませんでした。今はこれを調べる時間はもうありませんが、他の誰かが協力してパズルを解きたい場合に備えて、このアプローチについて言及したいと思います. そうでない場合は、今日か明日、もう少し詳しく調べてみます。

于 2010-10-27T00:14:42.203 に答える