0

なぜこれが機能しないのですか?

    SELECT up.first_name, up.last_name
    FROM user_profiles up 
    WHERE u.activated = 1
    AND up.first_name LIKE '%" . $search_term . "%'
    OR up.last_name LIKE '%" . $search_term . "%'
    OR CONCAT(up.first_name, '%', up.last_name) LIKE '%" . $search_term . "%'
    GROUP BY up.last_name
    ORDER BY up.last_name ASC;

ユーザーが入力するjoeと、オートコンプリートが返されますjoe smith。ユーザーが入力するsmithと、オートコンプリートが返されますjoe smith

しかし、ユーザーがjoe smith私のオートコンプリートを入力すると、空白が返されます。

ユーザーが [間に任意の数のスペース] をCONCAT入力した場合に、行が結果を返せるようにしたい。first_namelast_name

%任意の数の文字に対して機能すると思いますが、任意の数のスペースでは機能しません。コードを修正する方法はありますか?

ありがとう!

4

1 に答える 1

0

%a内のリテラルを探しているため$search_term (姓名と同様に)、機能しません

次の行を置き換えます。

OR CONCAT(up.first_name, '%', up.last_name) LIKE '%" . $search_term . "%'

この行で:

OR ('".$search_term."'  REGEXP CONCAT(up.first_name,[[:blank:]],up.lastname) ) 

これは、first_name と last_name に$%^[]などの特別な正規表現文字が含まれていない場合に機能します。

見る; http://dev.mysql.com/doc/refman/5.1/en/regexp.html
regexp はマルチバイト文字セットでは機能しないことに注意してください。一致する前に、それらを latin1 に変換してください。

OR (CONVERT('".$search_term."' USING LATIN1) 
   REGEXP CONVERT(CONCAT(up.first_name,[[:blank:]],up.lastname) USING LATIN1) ) 
于 2011-05-21T21:20:52.107 に答える