Есть ли способ использовать запрос SQL, который бы возвращал результаты, если значения могут быть в любом порядке?

0

Мой код позволяет выполнять поиск, если порядок слов правильный.

Скажем, я ищу big dog, но я также хочу найти dog big. Это усложняется тремя или более словами.

Есть ли способ создать SQL-запрос, который позволит мне искать значения в любом порядке?

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

    <?php

        if(isset($_GET['query']) && !empty($_GET['query'])) {
            $query = $_GET['query'];
            $query_array = explode(' ', $query);

            $query_string = '';

            $query_counter = 1;
            foreach($query_array as $word) {
                $query_string .= '%' . $word . (count($query_string) == $query_counter++ ? '%' : '');
            }

            $query = "SELECT * FROM pages WHERE Name LIKE '$query_string'";
            $result = sqlsrv_query($cms->conn, $query);

            while($row = sqlsrv_fetch_array($result)) {
                extract($row);

                echo '<a href="'.$Address.'.html">'.$Name.'</a><br>';
            }

            sqlsrv_free_stmt($stmt);
        }
        else {
            //echo 'NO GET';
        }

    ?>
Теги:
sql-server
search

4 ответа

2
Лучший ответ

Вы можете собрать свои условия и проверить каждое слово:

$query_array = explode(' ', $query);
$queryParts = array();
foreach ($query_arra AS $value){
   $queryParts[]="Name like '%".mysql_real_escape_string($value)."%'";
}

$searchString = implode(" AND ", $queryParts);

Строка поиска теперь будет Name like '%big%' AND Name like '%dog%'... в зависимости от того, сколько поисковых ключевых слов было там.

Я использую тот же подход очень часто, также когда требуется, чтобы ВСЕ ключевые слова отображались как минимум в одном столбце. Затем вам понадобится еще один цикл для создания необходимых условий AND:

$search = "Big Dog";
$keywords = explode (" ", $search);
$columns = array("Name", "description");

$andParts = array();
foreach ($keywords AS $keyword){
  $orParts = array();
    foreach($columns AS $column){
      $orParts[] = $column . " LIKE '%" . mysql_real_escape_string($keyword) . "%'";
    }
    $andParts[]= "(" . implode($orParts, " OR ") . ")";
}
$and = implode ($andParts, " AND ");

echo $and;

это создало бы часть запроса (Name like '%Big%' OR description like '%Big%') AND (Name like '%Dog%' or description like '%Dog%')

Таким образом, он найдет любую строку, где dog и big фигура появляются, по крайней мере, в одном из name или description столбцов (также могут быть как в одном столбце)

  • 0
    Это здорово! Но есть ли способ заставить это работать с подготовленными заявлениями? У меня нет доступа к реальному методу escape-строки MYSQL.
  • 0
    @HelpNeeder да, вы можете сделать это и для готовых заявлений. Просто замените вставку ключевого слова на соответствующий заполнитель и убедитесь, что вы поддерживаете правильное назначение заполнителя / значения в отдельном массиве, чтобы впоследствии можно было правильно связать значения.
2

Поскольку ваш первоначальный запрос является чем-то вроде %big%dog%, поэтому я предполагаю, что вы в порядке с соответствующей big wild dog. В этом случае вы можете просто использовать оператор AND.

(Name LIKE '%big%" and Name LIKE '%dog%")
  • 0
    Я думаю, что OP использовал большой и собаку в качестве примера. Он также сказал, что у него «3 или более слов». Конечно, вы могли бы превратить все вышеперечисленное в динамический SQL-запрос, но он будет очень дорогим и очень быстрым со всеми этими and like '%%' Вероятно, вам было бы лучше использовать полнотекстовый поиск, я бы подумал, что в подобных ситуациях.
1

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

https://msdn.microsoft.com/en-us/library/ms142571.aspx

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

Это не совсем тривиально настроить, но достаточно легко найти учебник по этому вопросу и как запросить у FTS (поскольку синтаксис отличается от того, что LIKE "% big% dog%")

Здесь пример запроса со страницы, указанной выше:

SELECT product_id 
FROM products 
WHERE CONTAINS(product_description, "Snap Happy 100EZ" OR FORMSOF(THESAURUS,Snap Happy) OR ‘100EZ) 
AND product_cost < 200 ;
1

myisam поддерживает полнотекстовый поиск: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

  • 0
    о, и Innodb в последней версии MySQL также.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню