MySQL - Добавление подстановочного знака для «любого количества пробелов» внутри CONCAT? - PullRequest
0 голосов
/ 22 мая 2011

Почему это не работает?

    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_name [любое количество пробелов между] last_name.

Я думаю, % будет работать для любого количества символов, но не для любого числапробелов .Есть идеи как исправить мой код?

Спасибо!

1 Ответ

0 голосов
/ 22 мая 2011

Это не работает, потому что вы ищете буквальный % внутри $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
Обратите внимание, что регулярное выражение не работает с многобайтовыми кодировками, преобразуйте их в latin1 перед сопоставлением.

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