You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL使用WHERE和LIKE逻辑运算符查询餐厅数据时status过滤失效如何解决

问题根源

你遇到的问题是两个错误共同导致的:

  • 逻辑运算优先级错误:SQL中AND的运算优先级高于OR,你原代码生成的SQL语句等价于WHERE (status = 1 AND city LIKE ?) OR address LIKE ?,只要某条记录匹配address的模糊查询条件,不管status值是不是1都会被返回,自然会出现status=0的记录。
  • 字段名拼写错误:你在城市模糊查询的参数中写的是cit,但表结构中对应的字段名是city,少写了字母y,导致城市过滤条件完全没有生效。

修正方案

你需要用查询分组把两个模糊查询的条件包裹起来,保证status=1是全局生效的前置条件,同时修正字段名拼写错误。你用的是CodeIgniter框架的查询构造器,可以用group_start()和group_end()实现条件分组,修正后的代码如下:

/**
 * 根据城市或地址查询餐厅
 *
 */
public function get_restaurant_by_city($city, $address="", $page_per_row, $pagenum)
{
    // 首先固定status=1的全局条件
    $this->db->where('status', 1);
    // 分组包裹两个OR的模糊查询条件
    $this->db->group_start();
    // 修正字段名cit为city
    $this->db->like('city', $city, 'both');
    if (!empty($address)) { // address为空时不触发该模糊查询,避免无效的全表匹配
        $this->db->or_like('address', $address, 'both');
    }
    $this->db->group_end(); //both = %query%, before = %query, after = query%

    if (isset($pagenum) && $pagenum !== 0) {
        $pagenum  = ($pagenum - 1) * $page_per_row;
    }else { 
        if(isset($_GET['page'])) {
            $pagenum  = ($pagenum + 1) * $page_per_row;
        }else {
            $pagenum  = 0;
        }
    }

    $find  = $this->db->get($this->table, $page_per_row , $pagenum);
    return $find->result();
}

修正后生成的SQL等价于WHERE status =1 AND (city LIKE ? OR address LIKE ?),完全符合你的查询需求,同时修正字段拼写后城市过滤条件也会正常生效。

内容的提问来源于stack exchange,提问作者Ns789

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 10:42:03