【问题标题】:How to select multiple where conditions using codeigniter?如何使用codeigniter选择多个where条件?
【发布时间】:2020-11-05 15:44:33
【问题描述】:

我的桌子

这是我的表,我必须使用多个 where 条件显示数据。首先我选择使用 dms_expire_date,为此我得到了答案,我在 where 条件下使用 dms_doc_name 但我没有得到正确的结果。

到目前为止我已经累了。

]

如果我在“where”中使用“或”,请查看这张图片

看这张图

我不知道该怎么做。请帮忙解决这个问题。

SELECT * FROM `dms_document` WHERE dms_expire_date BETWEEN '2020-05-01' AND '2020-07-16' AND dms_doc_name = '' OR dms_category_id = '' OR dms_subcategory_id=''

我也厌倦了阵列,但我没有结果。

$this->db->select('*');
$this->db->join('dms_category as C', 'C.dms_category_id = D.dms_category_id', 'left outer');
$this->db->join('dms_sub_category as S', 'S.dms_subcategory_id = D.dms_subcategory_id', 'left outer');
$this->db->where('dms_expire_date >=', $newstart);
$this->db->where('dms_expire_date <=', $newend);
$this->db->where(array('dms_doc_name' =>$docname,'D.dms_category_id'=>$category,'D.dms_subcategory_id'=>$subcategory));
$data['documents']= $this->db->get('dms_document as D')->result_array();

【问题讨论】:

  • 括号 () 最有可能出现问题,但是您期望得到什么结果?当你有dms_doc_name = ''dms_category_id = ''dms_subcategory_id = ''时你想看什么
  • 如果我在给定的 dms_expiriy 日期内给 doc_name 中的 testie 并且结果应该会来
  • tbh,我还是没有得到你想要的
  • 是的,但结果显示我想要 0 行
  • 为了澄清你真正想要的逻辑,我建议在 ... WHERE x AND y AND (z OR a OR b)... WHERE x AND (y AND z) OR (a OR b) 这样的不同查询之间添加括号。

标签: mysql codeigniter


【解决方案1】:

试试

SELECT * 
FROM dms_document
WHERE dms_expire_date BETWEEN $newstart AND $newend
AND CASE WHEN $docname IS NULL THEN 1 = 1 ELSE dms_doc_name = $docname END
AND CASE WHEN $category IS NULL THEN 1 = 1 ELSE dms_category_id = $category END 
AND CASE WHEN $subcategory IS NULL THEN 1 = 1 ELSE dms_subcategory_id = $subcategory END 

--

已编辑。等待清关。

如果我理解你的意思是正确的,那就是理解 AND、OR 和括号 () 的优先级的问题

-- 如果有人想使用fiddle,我已经为此问题创建了示例数据

【讨论】:

  • 我举个例子
  • 查看最后一列是结果但它是dms_doc_tag的excel图像
  • 最后一栏?具有 1,1,2,0,2,1,2,1 值的那一列?这些值对您预期的结果意味着什么
  • 让我们等待其他帮助,也许他们比我更能理解你的意思。
  • 你没有;不明白你的答案在哪里
【解决方案2】:

您可以使用 CodeIgniter 的 or_where() (v3 docs) 或 orWhere() (v4 docs) 编写 OR

//your initial query
$sql = "SELECT
            *
        FROM
            `dms_document`
        WHERE
            dms_expire_date BETWEEN '2020-05-01' AND '2020-07-16'
            AND dms_doc_name = ''
            OR dms_category_id = ''
            OR dms_subcategory_id=''";

//building the same query using CI
$this->db->select('*');
$this->db->from('dms_document');
$this->db->where('dms_expire_date >=', '2020-05-01');
$this->db->where('dms_expire_date <=', '2020-07-16');
$this->db->where('dms_doc_name', '');
$this->db->or_where('dms_category_id', '');
$this->db->or_where('dms_subcategory_id', '');

您可以通过运行$this-&gt;db-&gt;_compile_select();$this-&gt;db-&gt;last_query();https://stackoverflow.com/a/6145021/1499877 供参考)来确认此生成的查询。

echo '<pre>';
var_dump($sql);
var_dump($this->db->_compile_select());
echo '</pre>';
die();

【讨论】:

  • 我已经厌倦了这个,但我没有得到正确的结果
  • 我已更新此答案以匹配您最初发布的查询。您能否澄清一下您是尝试复制该确切查询还是尝试做其他事情?我不确定您在 CI 中的 JOIN 来自哪里,因为您的初始查询没有它们。
猜你喜欢
  • 2012-05-19
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
相关资源
最近更新 更多