Поиск в базе данных PHP / MYSQL Вопрос - PullRequest
3 голосов
/ 24 июня 2010

Прямо сейчас я просто использую простой

WHERE name LIKE '%$ser%'

Но я столкнулся с проблемой - скажем, что поиск - это «Тестирование 123», а «имя» - «Тестирование», он не возвращает никаких результатов. Знаете какой-нибудь способ это исправить? Я что-то не так делаю?

Ответы [ 6 ]

5 голосов
/ 25 июня 2010

Если вы хотите найти «Тестирование» или «123», используйте OR:

WHERE (name LIKE '%Testing%' OR name LIKE '%123%')

Обратите внимание, что это будет очень медленно, так как индекс не может быть использован, и он может вернуть некоторые результаты, которые вы не хотели (например, «4123»). В зависимости от ваших потребностей, лучшим вариантом может быть использование полнотекстового поиска или продукта индексации внешней базы данных, такого как Lucene.

3 голосов
/ 25 июня 2010

Вот как работает LIKE - он возвращает строки, которые полностью содержат строку поиска, и, если вы используете "%", необязательно содержат что-то еще.

Если вы хотите увидеть, еслиполе содержится в строке, вы можете сделать это следующим образом:

SELECT * FROM `Table` WHERE  "Testing 123" LIKE CONCAT("%",`name`,"%") 
1 голос
/ 25 июня 2010

неэффективно (как ваш пример), но работает так, как вы хотите:

WHERE name LIKE '%$ser%' OR '$ser' LIKE CONCAT('%', name, '%')
1 голос
/ 25 июня 2010

Как упоминал Скотт, вы не можете проверить, содержит ли поиск значение столбца, он работает наоборот. так что если $ser = "testing" и таблица имеет строку name = testing 123, она вернет

Для того, что вы пытаетесь сделать, вам нужно разбить поисковый запрос на термины и выполнить поиск ИЛИ с каждым из них или, что еще лучше, проверить mysql full text search, чтобы найти гораздо лучший подход

1 голос
/ 25 июня 2010

После замены переменной $ ser запрос будет:

WHERE name LIKE '%Testing 123%'

Вы должны построить запрос, разделив его словами:

WHERE name LIKE '%$word[1]%$word[2]%'

0 голосов
/ 25 июня 2010

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

Однако вы можете разделить строку поиска по границе слова и использовать логику ИЛИ, но сначала проверьте всю строку, а затем предложите возможность расширить поиск:

ПРИМЕЧАНИЕ. Очистка и подготовка входных данных не показаны.

1 . Запрос с:

$sql_where = "WHERE name LIKE '%$ser%'";  

2. Если возвращается ноль результатов, спросите пользователя, хотели бы они запросить каждое слово в отдельности.

3. Если пользователь запрашивает поиск по каждому слову, запросите с помощью:

$sql_where = get_sql_where($ser);

(рабочий) Пример кода ниже:

$ser = 'Testing 123';
$msg = '';

function get_sql_where($ser){
    global $msg;
    $sql_where = '';
    $sql_where_or = '';

    $ser = preg_replace("/[[:blank:]]+/"," ", trim($ser)); //replace consecutive spaces with single space
    $search_words = explode(" ", $ser);

    if($search_words[0] == ''){
        $msg = 'Search quested was blank.';
    }else{
        $msg = 'Search results for any of the following words:' . implode(', ', $search_words);
        $sql_where = "WHERE name LIKE '%$ser%'";
        foreach($search_words as $word){
            $sql_where_or .= " OR name LIKE '%$word%'";
        }
    }

    return $sql_where . $sql_where_or;
}

$sql_where = get_sql_where($ser);
//Run query using $sql_where string
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...