0

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

表的结构如下:

           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%'

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

streetname london 12345

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

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

非常感谢。

4

3 回答 3

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%')

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

于 2013-04-15T15:10:09.640 回答
0

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

(`zipcode` LIKE '12345%' AND `city` LIKE 'london%') OR (`street` LIKE 'london%' AND `city` LIKE 'streetname%') OR `street` LIKE 'streetname%'
于 2013-04-15T15:12:12.040 回答
0

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

尝试

( zipcodeLIKE '12345%' AND cityLIKE 'london%') OR ( streetLIKE 'london%' AND cityLIKE 'streetname%') OR ( streetLIKE 'streetname%')

于 2013-04-15T15:10:46.203 回答