【问题标题】:combining mysql AND OR queries in Codeigniter在 Codeigniter 中组合 mysql AND OR 查询
【发布时间】:2012-06-18 20:32:33
【问题描述】:

我想在 CI 中组合 AND OR mysql 查询。我已经看过这个帖子:http://codeigniter.com/forums/viewthread/92818/。 但他们没有提供确切的解决方案。

如何严格使用 CI 框架创建以下查询?(我可以轻松创建不带括号的查询,但它不是同一个查询。)

SELECT * FROM `Persons` WHERE
LastName='Svendson' AND Age="12" AND
(FirstName='Tove' OR FirstName='Ola' OR Gender="M" OR Country="India") 

P.S.:这只是一个示例查询,即使它没有任何意义也不建议将查询的整个 OR 部分写在单个 where() 中。

编辑:基本上我想要实现以下简单查询:

SELECT * FROM `table` WHERE field1='value1' AND (field2='value2' OR field3='value3') 

【问题讨论】:

    标签: php mysql codeigniter codeigniter-2


    【解决方案1】:

    查询本身没有意义,您正在选择:

    • 托夫·斯文森,12 岁
    • 奥拉·斯文森,12 岁
    • 任何名叫 Svendson 的男性,12 岁
    • 来自印度的任何 12 岁的 Svendson 人

    Tove 看起来像一个男人的名字,所以没有必要选择性别。 Ola 看起来像一个女孩的名字,所以选择性别不仅没有必要,而且没有任何意义。您的查询将返回任何名为 Svendson 的 12 岁男性、任何来自印度的名为 Svenson 的 12 岁男性以及 Tove 和 Ola Svendson(如果他们年满 12 岁)。

    你为什么不想把它放在 () 括号之间?出于某种原因,您想通过活动记录来完成它吗?

    【讨论】:

    • 查询只是一个测试。我随意写了我想到的任何东西。基本上我需要 f1=v1 AND (f2=v2 OR f3=v3) 类型的查询
    • & 我的问题也与选择无关,所以你不需要分析我的查询
    • 老兄,对投反对票的人很轻松,只是想把事情弄清楚。无论如何,您是否尝试过 $this->db->from("Persons"); $this->db->where("LastName","Svendson"); $this->db->where("年龄","12"); $this->db->or_where_in('FirstName',$arrFirstnames); $this->db->or_where_in('gender','M'); $this->db->or_where_in('Country','India')[/code]
    • OR 部分不在括号内。您正在生成的是不带括号的查询。我在我的问题中明确提到(I can create the query easily without the brackets but then it is not the same query.)
    【解决方案2】:

    这会起作用吗?

    $this->db->where('LastName', 'Svendson');
    $this->db->where('Age', 12);
    $this->db->where("(FirstName='Tove' OR FirstName='Ola' OR Gender='M' OR Country='India')", NULL, FALSE);
    $query = $this->db->get('Persons');
    return $query->result();
    

    【讨论】:

    • 是的,这会起作用,这是我目前正在使用的。但这不是严格的 CI 方式,我必须手动转义字符串。我也怀疑这种答案,所以在问题Do not suggest writing the entire OR part of the query inside a single where().中提到过
    • 我在最初的回答中问过您是否有理由使用活动记录来完成此操作,因为在 () 中定义查询是“严格的 codeigniter”,它只是不是活动记录。无论如何,这在 CI 中是不可能的,因为它们不允许您在 AR 中进行嵌套查询。有一个名为 IgnitedQuery 的查询字符串生成器:assembla.com/wiki/show/IgnitedRecord/IgnitedQuery
    • 这对我不起作用。第二个 where 条件覆盖了第一个 where 条件。 CodeIgniter V 2.1.4
    • ...NULL, FALSE) 是干什么用的?
    • NULL 是 Value 参数(非强制),FALSE 是删除查询引号(FALSE 因为这会影响括号)。
    【解决方案3】:

    当前使用 CI2,如果不扩展 Database 类并将方法的访问类型从私有更改为公共/受保护,则无法访问数据库类的查询生成器方法 ($this->db->_compile_select()),即杀死构建子查询的能力,就像您尝试使用 ActiveRecord 类构建一样。制作像您尝试构建的子查询的唯一方法是仅使用 db 查询方法

    $table = $this->db->dbprefix('tablename');
    
    $sql = "SELECT * FROM `{$table}` WHERE field1='?' AND (field2='?' OR field3='?') ";
    $this->db->query($sql,array($field1,$field2,$field3));  
    

    CI Subquerys 上有一篇关于这样做的博客文章,但它已过时,仅适用于 CI 1.7 希望能有所帮助。

    【讨论】:

      【解决方案4】:

      在 CodeIgniter 3 中,有一些新方法 group_start() and group_end() 正好用于此目的。

      return $this->db
           ->where('LastName', 'Svendson');
           ->where('Age', 12);
           ->group_start()
               ->where('FirstName','Tove')
               ->or_where('FirstName','Ola')
               ->or_where('Gender','M')
               ->or_where('Country','India')
           ->group_end()
           ->get('Persons')
           ->result();
      

      【讨论】:

      • 这个版本什么时候发布的?>
      • 这就是现在的方法。 +1
      • 如果我错了请纠正我。除了最后一个之外,您的语句中是否需要有一个分号?抱歉,CI 新手,
      • 它没有。更改了帖子以显示如何完全流利地做到这一点
      • 这个解决方案让我很开心!!!我花了很长时间才弄清楚这个简单的解决方案。谢谢。
      【解决方案5】:

      在 Codeigniter 中我们可以这样使用它很容易理解。

      $sql = "SELECT
                  *
              FROM
                  `Persons`
              WHERE
                  LastName = 'Svendson'
              AND Age = '12'
              AND (
                  FirstName = 'Tove'
                  OR FirstName = 'Ola'
                  OR Gender = 'M'
                  OR Country = 'India'
              )";
      
      $query = $this->db->query($sql);
      
      return $query->result();
      

      【讨论】:

      • 对我来说,它似乎比内置函数更容易
      【解决方案6】:
      【解决方案7】:

      你可以简单地使用它

      $this->db->where("status","live")->or_where("status","dead");
      

      你也可以使用

      $this->db->where("(status='live' OR status='dead')");
      

      【讨论】:

        【解决方案8】:

        使用codeigniter 3.0框架,有新功能可用于单独或where和where操作。即group by和group end

        类似代码,

        $this->db->where('LastName', 'Svendson');
        $this->db->where('Age', 12);
        $this->db->group_start();
        $this->db->or_where('FirstName','Tove');
        $this->db->or_where('FirstName','Ola');
        $this->db->or_where('Gender','M');
        $this->db->or_where('Country','India');
        $this->db->group_end();
        $query = $this->db->get('Persons');
        return $query->result();
        

        【讨论】:

        • 太棒了!有时间也会试试这个
        【解决方案9】:

        我在 CodeIgniter 2 中需要这个,但我需要这些值仍然被转义,所以 csotelo's answer 对我不好,我不想像 Shawn C's answer 那样重写整个查询,所以我最终这样做了:

        $this->db->where('LastName', $lastName);
        $this->db->where('Age', $age, false);
        $this->db->where('1 AND ( 0', null, false); // This one starts the group
          $this->db->or_where('FirstName', $firstName1);
          $this->db->or_where('FirstName', $firstName2);
          $this->db->or_where('Gender', $gender);
          $this->db->or_where('Country', $country);
        $this->db->or_where('0 )', null, false); // This one ends the group
        $query = $this->db->get('Persons');
        

        生成以下查询:

        SELECT *
        FROM (`Persons`)
        WHERE `LastName` =  'Svendson'
        AND Age = 12
        AND 1 AND ( 0 -- This one starts the group
        OR `FirstName` =  'Tove'
        OR `FirstName` =  'Ola'
        OR `Gender` =  'M'
        OR `Country` =  'India'
        OR 0 ) -- This one ends the group
        

        与此相同:

        SELECT * FROM (`Persons`) WHERE
        `LastName` = 'Svendson' AND Age = 12 AND 1 AND
        (0 OR `FirstName` = 'Tove' OR `FirstName` = 'Ola' OR `Gender` = 'M' OR `Country` = 'India' OR 0)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-27
          • 2013-03-29
          • 1970-01-01
          • 2020-07-11
          • 1970-01-01
          • 2012-10-10
          • 2021-12-04
          相关资源
          最近更新 更多