У меня есть select where like query для формы seach, которая выглядит следующим образом:
<?php $bucketsearch = sanitizeone($_POST["bucketsearch"], "plain"); $bucketsearch = strip_word_html($bucketsearch); ?> if(isset($_POST['search'])){ $result=MYSQL_QUERY( "SELECT * FROM buckets where bucketname like '%$bucketsearch%' order by bucketname"); }else{ $result=MYSQL_QUERY( "SELECT * FROM buckets order by bucketname"); }
Моя проблема заключается в том, что если кто-то ищет экземпляр для «apple and pear», я не получаю никаких результатов, содержащих какие-либо слова, я могу только заставить его возвращать результаты (результат 1) со всеми словами в нем.
Может ли кто-нибудь помочь мне сделать этот поиск немного более верным? Заранее спасибо.
Итак, вы хотите, чтобы поиск ИИ использовал каждое введенное слово, а не точную строку? Howbout что-то вроде этого:
$searchTerms = explode(' ', $bucketsearch); $searchTermBits = array(); foreach ($searchTerms as $term) { $term = trim($term); if (!empty($term)) { $searchTermBits[] = "bucketname LIKE '%$term%'"; } } ... $result = mysql_query("SELECT * FROM buckets WHERE ".implode(' AND ', $searchTermBits).");
это даст вам запрос типа:
SELECT * FROM buckets WHERE bucketname LIKE '%apple%' AND bucketname LIKE '%and%' AND bucketname LIKE '%pear%'
измените AND на OR, если вы хотите соответствовать любому из условий поиска, а не всем. Дальнейшие улучшения могут включать в себя определение некоторых слов остановки, таких как «и», чтобы дать лучшие результаты.
Я считаю, что лучшим решением будет использование регулярных выражений. Это самый чистый и, вероятно, самый эффективный. Регулярные выражения поддерживаются во всех используемых БД-машинах.
В MySQL есть оператор RLIKE
поэтому ваш запрос будет выглядеть примерно так:
SELECT * FROM buckets WHERE bucketname RLIKE "(?=.*apple)(?=.*and)(?=.*pear)"
Не проверял его, надеюсь, что мое выражение подходит для MySQL regexp «диалект».
Подробнее о поддержке MySql regexp:
http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp
Для вашего простого случая здесь вы можете заменить свой «и» на «%» (но я предполагаю, что вы ищете более полный ответ. (Это также будет специфичным для заказа, так как яблоко должно было появиться перед грушей .)
Er. Не лучшее решение, которое я бы подумал, но вы можете разбить слова на массив и вывести их на несколько LIKES. Сделайте некоторые замены, чтобы вытащить ANDs, ORs и т. Д., А затем запустить взрыв.
Тогда просто петля.
$ sql = SELECT * from Buckets where ";
Переверните массив, $ sql. = "Bucketname LIKE '%". $ arrayEl [i]. «% OR». Просто убедитесь, что на последней итерации не будет включать последний OR или добавить последнюю строку 0 = 1 и т. Д.
Не элегантный, не эффективный, но в этом случае он будет работать. Вы, честно говоря, лучше выполняете полнотекстовый поиск, если это текстовое поле.
Я хотел что-то с базовым SQL для моего поиска нескольких слов в базе данных MySQL. Поэтому я придумываю следующее.
$terms=explode(" ",$search); $count=count($terms); $sql="SELECT * FROM product WHERE"; for($i=0;$i<$count;$i++) { if($i!=$count-1) $sql = $sql. " (pname LIKE '%$terms[$i]%' OR category LIKE '%$terms[$i]%' OR sub_category LIKE '%$terms[$i]%' OR description LIKE '%$terms[$i]%') AND "; else $sql = $sql. "(pname LIKE '%$terms[$i]%' OR category LIKE '%$terms[$i]%' OR sub_category LIKE '%$terms[$i]%' OR description LIKE '%$terms[$i]%')"; }
Вы можете разделить «яблоко и грушу» на 2 строки; «яблоко» и «груша». Может быть, тогда вы можете сделать WHERE bucketname LIKE '%apple%' OR bucketname LIKE '%pear%'
. Я не знаю, поможет ли это.