【问题标题】:Conditions in Mysql query does not workMysql查询中的条件不起作用
【发布时间】:2013-04-15 23:12:12
【问题描述】:

为我的实时搜索引擎创建查询时遇到问题。

表的结构是这样的:

           street   | zipcode | city

col1.:  streetname  | 12345   | london
col1.:  otherstreet | 12345   | london

我的问题如下:

当我搜索12345 london streetname 时,我会得到一个错误的结果,因为这些查询很简单。当我回显查询时,我会得到以下结果:

`zipcode` LIKE '12345%' AND `city` LIKE 'london%' OR `street` LIKE 'london%' AND `city` LIKE 'streetname%' OR `street` LIKE 'streetname%'

我使用以下方法获取结果:

$where = ...

$query = $db->query("SELECT * FROM table WHERE $where");
$result = $query->num_rows;
    if ($result !== 0 ){
        echo $result;

        while ($row = $query->fetch_assoc()) {

            echo 
                $row["zipcode"], 
                ' ', 
                $row["city"]';

        }

    } 

对此感到好奇的是,当我将输入顺序更改为:

streetname 12345 london

然后我得到:

`city` LIKE 'streetname%' OR `street` LIKE 'streetname%' AND `city` LIKE 'london%' OR `street` LIKE 'london%' AND `zipcode` LIKE '12345%'

似乎最后一个ANDcondition 也有问题。当我将更改该示例中的邮政编码时:

streetname london 12345

没关系,即使邮政编码错误,我也会得到这个结果。

所以如果有人能给我提示来解决这个问题,我真的很感激。

非常感谢。

【问题讨论】:

  • 1) 运算符优先级 2) 括号

标签: php mysql


【解决方案1】:

AND 具有比OR 更严格的绑定优先级,因此您的第一个表达式被视为:

(`zipcode` LIKE '12345%' AND `city` LIKE 'london%')
OR (`street` LIKE 'london%' AND `city` LIKE 'streetname%')
OR (`street` LIKE 'streetname%')

第二个解析为:

(`city` LIKE 'streetname%')
OR (`Strasse` LIKE 'streetname%' AND `city` LIKE 'london%')
OR (`street` LIKE 'london%' AND `zipcode` LIKE '12345%')

您需要使用显式括号来指定您实际希望组合条件的方式。

【讨论】:

    【解决方案2】:

    您必须在选择中隔离他们的问题...

    试试

    (zipcode LIKE '12345%' AND city LIKE 'london%') 或 (street LIKE 'london%' AND city LIKE 'streetname%') 或 (street LIKE 'streetname %')

    【讨论】:

      【解决方案3】:

      使用双亲对条件进行分组,如下所示:

      (`zipcode` LIKE '12345%' AND `city` LIKE 'london%') OR (`street` LIKE 'london%' AND `city` LIKE 'streetname%') OR `street` LIKE 'streetname%'
      

      【讨论】:

        猜你喜欢
        • 2015-11-06
        • 2018-11-10
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 1970-01-01
        • 2014-01-23
        • 1970-01-01
        相关资源
        最近更新 更多