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
相关产品推荐
相关产品推荐

