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

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

    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%';

Любой совет?

Обновлено: Я тестирую имя «Ларри Смит». База данных хранит «Ларри» в столбце «first_name» и «Smith» в столбце «last_name». Данные чистые, без лишних пробелов, а поисковый запрос обрезан слева и справа.

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

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

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

Robert Gamble 20.11.2008 16:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
47
1
112 575
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

SELECT *,concat_ws(' ',first_name,last_name) AS whole_name FROM users HAVING whole_name LIKE '%$search_term%'

... наверное, то, что вы хотите.

Ответ принят как подходящий

То, что у вас есть, должно работать, но его можно свести к:

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

Не могли бы вы привести пример имени и поискового запроса, где это не работает?

Поддерживается ли этот синтаксис или что-то подобное во всех базах данных? Упоминается ли это в стандарте SQL?

Rohit Banga 08.01.2011 08:26

Есть ли способ сделать это, хотя и по-разному во всех базах данных?

Rohit Banga 08.01.2011 08:46

Как насчет того, чтобы сделать это в двух разных таблицах? Моя ситуация в разных таблицах, поэтому.

PinoyStackOverflower 27.09.2012 08:18

Вы знаете, можно ли в этом запросе использовать индексы?

AbcAeffchen 30.08.2014 17:56

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

Может быть, у вас есть пробелы в конце поля имени, что означает, что у вас есть два пробела между именем и фамилией, когда вы их объединяете? Использование 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);

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

Когда используешь

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.

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

TheStoryCoder 30.01.2014 16:47

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

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

Люку:

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

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

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

Добро пожаловать в Stack Overflow! Для оставления комментариев требуется 50 репутации. Да, посетителей раздражает то, что они могут добавить что-то полезное, но это также сокращает ненужную болтовню. Публикация того, что должно быть комментарием в качестве ответа, в любом случае не одобряется, но, поскольку вы предоставили информацию, имеющую отношение к решению проблемы, это, вероятно, нормально.

C. A. McCann 02.11.2012 00:00

Пятьдесят - довольно высокий предел: / В любом случае, я поддержал ваш ответ (+10 репутации) и связал его в своем сообщении. Спасибо за дополнение :)

Luc 02.11.2012 02:05

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

TheStoryCoder 30.01.2014 16:47

Вы можете попробовать это:

select * FROM table where (concat(first_name, ' ', last_name)) = $search_term;

Вам нужно будет добавить скобки к вашему "$ search_term"

Naruto 24.11.2014 18:59

Это также требует, чтобы пользователь вводил имя точно, а не частичные совпадения (пример: «Пэт» соответствует «Пэт» и «Патрик»).

Phil M 28.12.2016 02:10

Другие вопросы по теме