2

おそらく MyISAM の代わりに InnoDB を使用しているため、mySQL ワイルドカード クエリが機能していません。

SELECT a.product_id, a.category_id FROM products a 
LEFT JOIN users u ON u.userid=a.ownerid 
WHERE a.active=1 AND a.approved=1 
AND a.deleted=0 AND a.name LIKE '%*my*%' 
AND a.name LIKE '%*donuts*%' 
AND (a.name REGEXP '( )*(*my*)*( )*(*donuts*)( )*') 

ワイルドカードの代わりに単語が使用されている場合はいつでも正常に機能しますが、それは問題ではありません。

私はちょうど疑問に思っています、の一部ですか

(a.name REGEXP '( )*(*my*)*( )*(*donuts*)( )*') 

すでに行った後に本当に必要

LIKE '%*my*%' AND a.name LIKE '%*donuts*%'

違いはなんですか?

4

1 に答える 1

4

違いはなんですか?

  • 正規表現

    (a.name REGEXP '( )*(*my*)*( )*(*donuts*)( )*')
    

    これは、量指定子 (エスケープ*されていない文字など) がグループの先頭 (エスケープされていない文字の直後) では無効であるため、エラーが発生します(。それが発生する 2 回を無視すると、次のようになります。

    (a.name REGEXP '( )*(my*)*( )*(donuts*)( )*')
    

    これは次のものに一致a.nameします:

    1. 0 個以上のスペース、その後に続く
    2. 次の 0 回以上の出現:

      • 文字m、その後に続く
      • 0 個以上の文字y

      に続く

    3. 0 個以上のスペース、その後に続く
    4. 文字シーケンスdonut、その後に続く
    5. 0 個以上の文字s、その後に続く
    6. 0 個以上のスペース

     

  • シンプルなパターン

    a.name LIKE '%*my*%' AND a.name LIKE '%*donuts*%'
    

    これは次のものに一致a.nameします:

    1. 任意の文字列に続く
    2. 文字シーケンス*my*、その後に続く
    3. 任意の文字列

    そして

    1. 任意の文字列に続く
    2. 文字シーケンス*donuts*、その後に続く
    3. 任意の文字列
于 2012-05-03T07:57:21.037 に答える