Использование mysql concat () в предложении WHERE?

32

Я хотел бы выполнить поиск в моей таблице с столбцом с именами и столбцом с именами. В настоящее время я принимаю поисковый запрос из поля и сравниваю его с обоими столбцами, по одному с

    select * from table where first_name like '%$search_term%' or 
    last_name like '%$search_term%';

Это отлично работает с терминами поиска по одному словарю, но в набор результатов входят все с именем "Ларри". Но если кто-то вводит имя, то пробел, затем фамилию, я хочу более узкий результат поиска. Я пробовал следующее без успеха.

    select * from table where first_name like '%$search_term%' or last_name 
    like '%$search_term%' or concat_ws(' ',first_name,last_name) 
    like '%$search_term%';

Любые советы?

EDIT: Название, с которым я тестирую, - "Ларри Смит". ДБ хранит "Ларри" в столбце "first_name" и "Smith" в столбце "last_name". Данные чистые, без лишних пробелов, а поисковый запрос обрезается влево и вправо.

РЕДАКТИРОВАТЬ 2: Я попробовал ответить Роберту Гэмбл сегодня утром. Его очень похоже на то, что я бежал прошлой ночью. Я не могу это объяснить, но сегодня утром это работает. Единственное различие, о котором я могу думать, это то, что вчера вечером я запустил функцию concat как третий "или" сегмент моего поискового запроса (после просмотра first_name и last_name). Сегодня утром я провел его как последний сегмент, просмотрев выше, а также адреса и названия компаний.

Работает ли функция mysql в конце запроса лучше, чем в середине?

  • 0
    Я только что запустил версию, с которой у вас были проблемы, и она отлично работает для меня.
Теги:

7 ответов

65
Лучший ответ

Что вам нужно, но можно свести к:

select * from table where concat_ws(' ',first_name,last_name) 
like '%$search_term%';

Можете ли вы указать имя примера и поисковый запрос, где это не работает?

  • 0
    Я согласен, я запустил это, и он ведет себя так, как вы ожидаете ...
  • 0
    Этот синтаксис или что-то подобное поддерживается всеми базами данных? Это упомянуто в стандарте SQL?
Показать ещё 3 комментария
8

Обратите внимание, что поисковый запрос теперь чувствителен к регистру.

При использовании

SELECT * FROM table WHERE `first_name` LIKE '%$search_term%'

Он будет соответствовать как "Ларри", так и "Ларри". С этим concat_ws он внезапно станет чувствительным к регистру!

Это можно исправить, используя следующий запрос:

SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', `first_name`, `last_name`) LIKE UPPER('%$search_term%')

Изменить: Обратите внимание, что это работает только с не двоичными элементами. См. Также ответ mynameispaulie.

  • 0
    Смотрите также этот ответ
  • 2
    Если вы объединяете целочисленные поля, чувствительность к регистру также может быть результатом ошибки в MySQL до версии 5.5 - см. Этот ответ
4

Люку:

Я согласен с вашим ответом, хотя хотел бы добавить, что UPPER работает только с недвоичными элементами. Если вы работаете с столбцом AGE (или любым числом), вам необходимо выполнить преобразование CAST, чтобы функция UPPER работала правильно.

SELECT * FROM table WHERE UPPER(CONCAT_WS(' ', first_name, last_name, CAST(age AS CHAR)) LIKE UPPER('%$search_term%');

Прости меня за то, что я не отвечал на Люка напрямую, но ради жизни я не мог понять, как это сделать. Если администратор может переместить мой пост, сделайте это.

  • 0
    Добро пожаловать в переполнение стека! Оставление комментариев требует 50 репутации . Да, это раздражает посетителей, которые могут добавить что-то полезное, но это также уменьшает ненужную болтовню. Публикация того, что должно быть комментарием в качестве ответа, в любом случае осуждается, но, поскольку вы предоставили информацию, относящуюся к решению проблемы, вероятно, все в порядке.
  • 0
    Пятьдесят - это довольно высокий лимит: / Во всяком случае, я проголосовал за ваш ответ (+10 повторений) и связался с ним в своем посте. Спасибо за добавление :)
Показать ещё 1 комментарий
2
SELECT *,concat_ws(' ',first_name,last_name) AS whole_name FROM users HAVING whole_name LIKE '%$search_term%'

... возможно, то, что вы хотите.

1

вы можете сделать это (работа в mysql), вероятно, другой SQL тоже.. просто попробуйте это:

select * from table where concat(' ',first_name,last_name) 
    like '%$search_term%';
  • 0
    попробовал один, и это сработало очень хорошо. Спасибо
1

Есть несколько вещей, которые могут мешать - ваши данные чистые?

Может быть, у вас есть пробелы в конце поля первого имени, что означает, что у вас есть два пробела между первым и последним, когда вы их объединяете? Использование trim (first_name)/trim (last_name) исправит это, хотя реальное исправление заключается в обновлении ваших данных.

Вы также можете найти это, когда два слова встречаются, но не обязательно вместе (предполагая, что вы находитесь в php, который предлагает вам переменная $search_term)

$whereclauses=array();
$terms = explode(' ', $search_term);
foreach ($terms as $term) {
    $term = mysql_real_escape_string($term);
    $whereclauses[] = "CONCAT(first_name, ' ', last_name) LIKE '%$term%'";
}
$sql = "select * from table where";
$sql .= implode(' and ', $whereclauses);
-2

Вы можете попробовать следующее:

select * FROM table where (concat(first_name, ' ', last_name)) = $search_term;
  • 1
    Вам нужно будет добавить скобки в ваш '$ search_term'
  • 0
    Это также требует, чтобы пользователь вводил имя точно вместо частичных совпадений (пример: «Pat» соответствует «Pat» и «Patrick»)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню