Как использовать CONCAT_WS вместо FULL-TEXT SEARCH - PullRequest
0 голосов
/ 18 февраля 2012

MySQL

+----+-------------------+----------+--------------+
| id | address           | city     | state        |      
+----+-------------------+----------+--------------+
| 1  | 13000 highway 244 | keystone | south dakota |
+----+-------------------+----------+--------------+

(кстати, я упустил некоторые столбцы, чтобы было проще)

PHP

$string = mysql_real_escape_string('13000 highway 244 south dakota');

$a = mysql_query("

    SELECT * FROM `table` WHERE

    CONCAT_WS(' ', `address`, `city`, `state`) LIKE '%$string%'

");

Приведенный выше поисковый запрос не возвращает результатов, будет работать только следующее values:

  • 13000 шоссе 244 Keystone Южная Дакота
  • 13000 шоссе 244 трапецеидальных искажений
  • Трапецеидальный камень Южная Дакота

Однако я также хочу заставить работать values:

  • 13000 шоссе 244 Южная Дакота
  • 13000 шоссе трапецеидальных искажений
  • Трасса, основанная на шоссе Южная Дакота
  • и т.д.

Возможно ли это даже не полагаясь на full-text search?

Ответы [ 2 ]

1 голос
/ 18 февраля 2012

Почему бы не сделать код более явным, как этот?

$address = mysql_real_escape_string('13000 highway 244');
$city = mysql_real_escape_string('keystone');
$state = mysql_real_escape_string('south dakota');

$a = mysql_query( '

    SELECT * 
      FROM `table` 
     WHERE (   ( address = ' . $address . ' )
           AND ( city    = ' . $city    . ' )
           AND ( state   = ' . $state   . ' )
           )
        OR ( state   = ' . $state   . ' )
             .. probably more alternatives ...
');
0 голосов
/ 31 июля 2013

перед передачей строки для запроса замените пробелы символами подстановки, чтобы даже "130 дакода" работало

$string = str_replace( array('*', '?', ' '), array('%', '_', '%'), $string); //Change norm wildcards to mysql format and replace spaces with wildcards

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...