codeigniter 忽略部分搜索查询
codeigniter ignoring part of search query
我发现自己对这个特定的 codeigniter MySQL 查询有问题。
我正在尝试搜索我的数据库行,其中 3 个 fields/columns 中的任何一个都包含与搜索字符串相同的短语,但 "status" 不得标记为 "deleted"
我第一次尝试:
$this->db->where('status !=', 'deleted');
$this->db->like('meta_title', $string);
$this->db->or_like('name', $string);
$this->db->or_like('text_full', $string);
但它完全忽略了 meta_title 字段,它根本不会比较或查看 "meta_title"。然后我根据别人的 stackexchange 问题尝试了以下方法,它解决了这个问题,但现在它忽略了:
WHERE `status` != 'deleted'
我的代码
$rows = $this->db->query("SELECT * FROM `categories` WHERE `name` LIKE '%$string%' OR `meta_title` LIKE '%$string%' OR `slug` LIKE '%$string%' OR `text_full` LIKE '%$string%' AND `status` != 'deleted' ")->result_array();
var_dump($rows);
echo $this->db->last_query(); die();
这returns所有行,甚至标记为已删除的行,
我也试过没有反勾我也试过
`status` NOT LIKE 'deleted'
像这样
$rows = $this->db->query("SELECT * FROM `categories` WHERE `name` LIKE '%$string%' OR `meta_title` LIKE '%$string%' OR `slug` LIKE '%$string%' OR `text_full` LIKE '%$string%' AND `status` NOT LIKE 'deleted' ")->result_array();
的结果
echo $this->db->last_query(); die();
是:
SELECT * FROM `categories` WHERE `name` LIKE '%buyer%' OR `meta_title` LIKE '%buyer%' OR `slug` LIKE '%buyer%' OR `text_full` LIKE '%buyer%' AND `status` != 'deleted'
我也试过在查询的开头放置 WHERE status
!= 'deleted'
我不是很精通网络开发,但我已经解决了这个问题,不幸的是我已经到了需要帮助来理解我做错了什么的地步。
请
当你在 SQL 谓词中使用 OR
运算符时,事情就变得很愚蠢了。本质上,你的声明说,
"I want rows that are not deleted - OR - rows that match my other conditions."
您需要将可选条件括在括号中,以将它们与所有行所需的条件分开:
SELECT *
FROM `categories`
WHERE `status` != 'deleted'
AND (`meta_title` LIKE '%$string%'
OR `slug` LIKE '%$string%'
OR `text_full` LIKE '%$string%'
OR `name` LIKE '%$string%');
我发现自己对这个特定的 codeigniter MySQL 查询有问题。
我正在尝试搜索我的数据库行,其中 3 个 fields/columns 中的任何一个都包含与搜索字符串相同的短语,但 "status" 不得标记为 "deleted"
我第一次尝试:
$this->db->where('status !=', 'deleted');
$this->db->like('meta_title', $string);
$this->db->or_like('name', $string);
$this->db->or_like('text_full', $string);
但它完全忽略了 meta_title 字段,它根本不会比较或查看 "meta_title"。然后我根据别人的 stackexchange 问题尝试了以下方法,它解决了这个问题,但现在它忽略了:
WHERE `status` != 'deleted'
我的代码
$rows = $this->db->query("SELECT * FROM `categories` WHERE `name` LIKE '%$string%' OR `meta_title` LIKE '%$string%' OR `slug` LIKE '%$string%' OR `text_full` LIKE '%$string%' AND `status` != 'deleted' ")->result_array();
var_dump($rows);
echo $this->db->last_query(); die();
这returns所有行,甚至标记为已删除的行,
我也试过没有反勾我也试过
`status` NOT LIKE 'deleted'
像这样
$rows = $this->db->query("SELECT * FROM `categories` WHERE `name` LIKE '%$string%' OR `meta_title` LIKE '%$string%' OR `slug` LIKE '%$string%' OR `text_full` LIKE '%$string%' AND `status` NOT LIKE 'deleted' ")->result_array();
的结果
echo $this->db->last_query(); die();
是:
SELECT * FROM `categories` WHERE `name` LIKE '%buyer%' OR `meta_title` LIKE '%buyer%' OR `slug` LIKE '%buyer%' OR `text_full` LIKE '%buyer%' AND `status` != 'deleted'
我也试过在查询的开头放置 WHERE status
!= 'deleted'
我不是很精通网络开发,但我已经解决了这个问题,不幸的是我已经到了需要帮助来理解我做错了什么的地步。
请
当你在 SQL 谓词中使用 OR
运算符时,事情就变得很愚蠢了。本质上,你的声明说,
"I want rows that are not deleted - OR - rows that match my other conditions."
您需要将可选条件括在括号中,以将它们与所有行所需的条件分开:
SELECT *
FROM `categories`
WHERE `status` != 'deleted'
AND (`meta_title` LIKE '%$string%'
OR `slug` LIKE '%$string%'
OR `text_full` LIKE '%$string%'
OR `name` LIKE '%$string%');