mysql LIKE无法正常使用OR

时间:2015-09-24 13:16:49

标签: php mysql

我的网站上有一个搜索栏,我在这个用户的帮助下使用谷歌地方api自动完成服务可以插入城市,州,国家,地址,邮政编码。我在mysql数据库中的字段是国家,州,城市,地址,邮政编码。我正在使用mysql LIKE子句来搜索记录。我的查询是:

{{1}}

我试图从搜索字符串中删除逗号,但没有运气。如果我只插入国家或仅城市或仅插入州或地址或仅邮政编码,那么它会给出正确的结果但是当我搜索地址,城市,州,国家或地区时改变它不起作用的顺序请帮助我。提前谢谢。

3 个答案:

答案 0 :(得分:1)

注意空格和引号。试试这样:

$sql = "SELECT * 
          FROM location
         WHERE country LIKE '%$search%' 
            OR city    LIKE '%$search%' 
            OR state   LIKE '%$search%' 
            OR address LIKE '%$search%'
            OR zipcode LIKE '%$search%'";

答案 1 :(得分:0)

您正在尝试使用LIKE语句获取记录,尝试连接这样的字段:

$sql = "SELECT * FROM location WHERE CONCAT(country, ' ', state, ' ',city, ' ', address, ' ', zip_code) like '%" . $search . "%'";

如果您想获得更好的结果,可以使用 PHP function explode ,如下所示:

    $words = explode(' ', $search);
$i = 0;
foreach($words as $p) {
    if ($i == 0) {
        $sql_aux = $sql_aux . "CONCAT(country, ' ', state, ' ',city, ' ', address, ' ', zip_code) like '%" . $p . "%'";
    }
    elseif($i > 0) {
        $sql_aux = $sql_aux . "and CONCAT(country, ' ', state, ' ',city, ' ', address, ' ', zip_code) like '%" . $p . "%'";
    }
    $i++;
}

答案 2 :(得分:0)

这不是问题,只能在SQL中解决。

重要的注意事项:阅读SQL注入。在任何情况下,都不应该通过将变量直接连接到其中来构建查询。

您要做的是 - 如果您从数据库的角度停下来查看它 - 请求数据库读取表格的每一行并搜索可能的匹配项。

即使它有效,它也不会很好用,除非你有一个非常小的数据集,因为每个查询都必须读取整个表。

但是,你的比较是倒退的。

你可能真的不想评价这个:

city LIKE '%$string%'
state LIKE '%$string%'

'Houston' LIKE '%Houston, TX%' # false!
'TX' LIKE '%Houston, TX%' # also false!

当您考虑您的查询要求服务器执行的操作时,您的逻辑似乎不起作用。 LIKE的论点在任何意义上都不是可交换的。

您实际上想要找到的更像是 this

'$string' LIKE CONCAT('%',city,'%')
'$string' LIKE CONCAT('%',state,'%')

'Houston, TX' LIKE '%Houston%' # true!
'Houston, TX' LIKE '%TX%' # also true!

您实际上需要反转比较以使查询在逻辑上正确。

但是,对于较大的数据集,逻辑上的正确性仍然会非常糟糕,因为服务器必须完成很多工作,并且不能使用查询优化器通常可用的任何快捷方式。这是一种蛮力方法,基本上是最糟糕的方法。

正确的解决方案要复杂得多:您必须对应用程序中的地址进行标记,并进行智能查询,这将是一个完全不同的查询,具体取决于搜索框内容中的模式。一旦确定了您认为的内容,例如状态,您的WHERE子句应该是特定的,并且是左侧锚定的:

WHERE state LIKE CONCAT($parsed_state,'%')

如果可以避免,则不要在LIKE参数的开头使用%。如果您希望具有合理的性能并且可能能够利用列上的索引,则仅在最后使用它们。

对自由格式地址进行标记,即使是“完整”地址,也不是一件容易的事。例如,请参阅How to parse freeform street/postal address out of text, and into components