【问题标题】:How to use CONCAT_WS instead of FULL-TEXT SEARCH如何使用 CONCAT_WS 而不是 FULL-TEXT SEARCH
【发布时间】:2012-02-17 23:29:57
【问题描述】:

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 基石南达科他州
  • 13000国道244路基石
  • 基石南达科他州

但是,我还想让以下values 工作:

  • 13000 高速公路 244 南达科他州
  • 13000公路基石
  • 南达科他州公路基石

不依赖full-text search,这是否可能?

【问题讨论】:

  • 对此的解决方案将是一个相当密集的关键字搜索,它不依赖于在另一个字符串中查找一个字符串的存在。您最好的两个解决方案是使用多个输入来基于每个字段进行搜索,或者使用文本区域并使用换行符 (\n) 作为每个信息块的分隔符,例如。 $string = explode(PHP_EOL, $textarea);为什么?因为CONCAT_WS 不适合应该是简单的查询。

标签: php mysql concat-ws


【解决方案1】:

为什么不像这样更明确地编码?

$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 ...
');

【讨论】:

  • 好吧,我只有一个输入字段,我无法判断用户输入的是地址、城市还是州。而且我也不想将它们全部保存在数据库的一个字段中。不过还是谢谢!
  • 是的,我宁愿只看到一个输入字段,也不愿看到三个或更多。例如,谷歌地图也是如此。我无法想象在谷歌地图上寻找一个地方,并且必须在单独的输入字段中输入地址、城市、州。不过谢谢你的建议 :) 我想我只需要使用全文搜索。
【解决方案2】:

在将字符串传递给查询之前,用通配符替换空格,这样即使“130 dakoda”也可以工作

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多