2008-11-19 2 views
32

Я хотел бы найти в моей таблице столбец с именами и фамилиями. В настоящее время я принимаю слово для поиска из поля и сравнить ее с обеих колонн, по одному сИспользование 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%'; 

Любой совет?

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

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

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

+0

Я просто побежал версию вы возникли проблемы с и она отлично работает для меня. – 2008-11-20 13:12:43

ответ

66

То, что вы должны работать, но может быть уменьшена до:

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

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

+0

Я согласен, я побежал, и он ведет себя так, как вы ожидали ... – 2008-11-19 23:50:41

+0

Является ли этот синтаксис или что-то подобное поддерживаемым всеми базами данных? Он упоминается в стандарте SQL? – 2011-01-08 05:26:51

+0

Есть ли способ сделать это, хотя и по-разному во всех базах данных? – 2011-01-08 05:46:28

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

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

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); 
9

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

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

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

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

Это может быть исправлено с помощью следующего запроса:

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

Edit: Обратите внимание, что это работает только на небинарных элементов. См. Также mynameispaulie's answer.

1

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

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

Люку:

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

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

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

-1

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

select * FROM table where (concat(first_name, ' ', last_name)) = $search_term; 
Смежные вопросы