2013-10-04 4 views
0

Так что я работаю над этим сайтом, и я просто добавил кнопку поиска. Все отлично работает, когда я использую простой поисковый запрос, какСоздание поля поиска

SELECT `student_id` FROM `student` WHERE `username` LIKE 'jo%' OR `firstname` LIKE 'jo%' OR `lastname` LIKE 'jo%' OR `surname` LIKE 'jo%' OR `email` LIKE 'jo%' 

Это будет возвращать весь идентификатор с именем, совпадающим Джоном из базы данных, посмотрев на поля «имя пользователя», Firstname, фамилия, и так далее.

Однако проблема заключается в том, что пользователь вставляет пробел между параметром поиска (что по сути означает, что он ищет ученика по обоим именам), результат ничего.

Я понял, что это потому, что он ищет параметр поиска (скажем, «john doe») независимо в каждом поле.

Как мне обойти это.

+0

Вы переключаетесь на поиск 'FULLTEXT', что делает поиск таким простым: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html –

ответ

0

Если вы хотите попасть в поиск/сопоставление по нескольким столбцам, вам действительно нужно изучить возможности полнотекстового поиска MySQL. Смотрите эту ссылку для документации, чтобы вы начали:

http://dev.mysql.com/doc/refman/5.5/en/fulltext-natural-language.html

Это будет масштабироваться гораздо лучше, чем пытаться LIKE через кучу колонок.

+0

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

+0

@JohnKariuki Да. По крайней мере, относительно индексов на ваших столбцах. Также потребуется, чтобы вы использовали MyISAM в качестве механизма хранения для таблицы, поэтому, если в настоящее время у вас есть таблица InnoDB и полагайтесь на определенные функции InnoDB, вам нужно будет более тщательно пересмотреть схему. –

0
SELECT * FROM student 
    WHERE username LIKE REPLACE(username, ' ', '') = REPLACE("Twitt er", ' ', '') 
+0

uhm @Arun Kumar M, как именно это работает? –

2

Я точно не знаю, как вы хотели бы, чтобы относиться к этим, вы могли бы добавить к вашей ИНЕКЕ также поиск против FirstName и LastName полей с пространством между ними.

CONCAT(`firstname`, ' ', `lastname`) LIKE 'jo%' 

или вы можете отказаться от шаблона и выполнить точный поиск.

CONCAT(`firstname`, ' ', `lastname`) = 'jo' 
+0

Спасибо Том и Марк Б, позвольте мне попробовать оба варианта и посмотреть, как все выкатывается –

0

Вы можете предположить, что существование пробела означает, что пользователь ищет комбинацию из первого и последнего имени. (на самом деле ваш пользовательский интерфейс может это указать).

затем использовать

$name = split(' ' , $incoming); 

Затем вы создаете проверку условий ли [1] существует $ имя, а затем работать ли искать

$where_clause = WHERE firstname = $name[0] AND lastname = $name[1]; 

Если это не удается, попадают обратно :

$where_clause = WHERE firstname = $name[0] 

или

$where_clause = WHERE lastname = $name[1] 

и так далее.

Затем используйте это нравится:

SELECT `student_id` FROM `student` . $where_clause 

Это несколько pseudocodish, но вы получите картину, я надеюсь.

Есть более элегантные способы достижения такого sql-builder, но я предлагаю его как способ показать, как вы можете начать думать об этом - комментарии «использовать FULLTEXT» в стороне.

0

Есть два способа сделать это:

1) Как вы пытаетесь

`

 $search_term= "Mike Brant"; 
     $term_part = preg_split('/ /', $search_term); 
    /* 
     term_part[0]=Mike 
     term_part[1]=Brant 
    */ 
    foreach($term_part as $value){ 
    $like. = " `username` LIKE '".$value."%' OR `firstname` LIKE '".$value."%' OR `lastname` LIKE '".$value."%' OR `surname` LIKE '".$value."%' OR `email` LIKE '".$value."%' OR " 
    } 
    $like = substr($like, 0, -3); 
    $sql = "SELECT `student_id` FROM `student` WHERE ".$like."; 
` 

2) Использование полнотекстового поиска таблицы двигателя MYISAM узнать больше о FULLText

FULLTEXT - лучший вариант для поисковых запросов

Смежные вопросы