【问题标题】:Unable to fetch correct row in codeigniter by using multiple join无法通过使用多个连接在 codeigniter 中获取正确的行
【发布时间】:2015-09-16 05:35:56
【问题描述】:

我想在括号中添加多个类似的条件。 这是我的CI Active Record 代码:-

$this->db->select("ev.`created_date`,u.first_name,u.last_name,ev.`expert_id` , ev.`posted_by` ,
        ev.`segment_id` , ev.`expert_title` , ev.`expert_discription` , ev.`status` , s.segment", FALSE);
    $this->db->from($this->db->dbprefix . 'expert_view as ev');
    $this->db->join($this->db->dbprefix . 'segment as s', 's.segment_id=ev.segment_id');
    $this->db->join($this->db->dbprefix . 'users as u', 'u.id=ev.posted_by');
    if ($this->session->userdata('group_id') != 1) {
        $this->db->where('ev.posted_by', $this->session->userdata('userid'));
    }
    if ($sSearch) {
        $this->db->like('u.first_name', $sSearch);
        $this->db->or_like('u.last_name', $sSearch);
        $this->db->or_like('ev.created_date', $sSearch);
        $this->db->or_like('ev.posted_by', $sSearch);
        $this->db->or_like('ev.`expert_title`', $sSearch);
        $this->db->or_like('s.`segment`', $sSearch);
    }
echo $this->db->last_query();

输出来自上述代码:

SELECT ev.`created_date`, u.first_name, u.last_name, ev.`expert_id`, ev.`posted_by`, ev.`segment_id`
, ev.`expert_title`, ev.`expert_discription`, ev.`status`, s.segment
FROM (`adv_expert_view` as ev)
JOIN `adv_segment` as s ON `s`.`segment_id`=`ev`.`segment_id`
JOIN `adv_users` as u ON `u`.`id`=`ev`.`posted_by`
WHERE `ev`.`posted_by` =  '14'
AND  `u`.`first_name`  LIKE '%a%'
OR  `u`.`last_name`  LIKE '%a%'
OR  `ev`.`created_date`  LIKE '%a%'
OR  `ev`.`expert_title`  LIKE '%a%'
OR  `s`.`segment`  LIKE '%a%'

预期查询:

 SELECT ev.`created_date`, u.first_name, u.last_name, ev.`expert_id`, ev.`posted_by`, ev.`segment_id`
, ev.`expert_title`, ev.`expert_discription`, ev.`status`, s.segment
FROM (`adv_expert_view` as ev)
JOIN `adv_segment` as s ON `s`.`segment_id`=`ev`.`segment_id`
JOIN `adv_users` as u ON `u`.`id`=`ev`.`posted_by`
WHERE `ev`.`posted_by` =  '14'
AND  (`u`.`first_name`  LIKE '%a%'
OR  `u`.`last_name`  LIKE '%a%'
OR  `ev`.`created_date`  LIKE '%a%'
OR  `ev`.`expert_title`  LIKE '%a%'
OR  `s`.`segment`  LIKE '%a%')

【问题讨论】:

    标签: php codeigniter activerecord


    【解决方案1】:

    如果您使用 CI 3,您可以使用 ->group_start()->group_end() 添加括号。更多详情请阅读Query grouping

    $this->db->group_start()
    $this->db->like('u.first_name', $sSearch);
            $this->db->or_like('u.last_name', $sSearch);
            $this->db->or_like('ev.created_date', $sSearch);
            $this->db->or_like('ev.posted_by', $sSearch);
            $this->db->or_like('ev.`expert_title`', $sSearch);
            $this->db->or_like('s.`segment`', $sSearch);
    
    $this->db->group_end()
    

    FOR CI 2 您可以将条件创建为

    $this->db->where("(`u`.`first_name` LIKE '%a%' OR `u`.`last_name` LIKE '%a%' OR `ev`.`created_date`  LIKE '%a%' OR  `ev`.`expert_title`  LIKE '%a%' OR `s`.`segment`  LIKE '%a%')");
    

    【讨论】:

    • 我正在使用 CI 2.1,它显示错误 Call to undefined method CI_DB_mysql_driver::group_start()
    • @chotesah 此功能仅适用于 CI 3,不适用于 CI 2。
    • 那有什么解决办法呢? @Saty
    • 感谢@Saty 作为答案和cmets 的快速回复。
    • 嗨@clsah,如果这个或任何答案解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
    【解决方案2】:

    这样做:-

    $query = "SELECT ev.`created_date`, u.first_name, u.last_name, ev.`expert_id`, ev.`posted_by`, ev.`segment_id`
    , ev.`expert_title`, ev.`expert_discription`, ev.`status`, s.segment
    FROM (`adv_expert_view` as ev)
    JOIN `adv_segment` as s ON `s`.`segment_id`=`ev`.`segment_id`
    JOIN `adv_users` as u ON `u`.`id`=`ev`.`posted_by`";
    
            $query.= " WHERE";
    
            if ($this->session->userdata('group_id') != 1) {
                $query.= " `ev`.`posted_by` =" . $this->session->userdata('userid') . " AND";
            }
    
            if ($sSearch) {
                $query.= " (`u`.`first_name`  LIKE '%$sSearch%'
                    OR  `u`.`last_name`  LIKE '%$sSearch%'
                    OR  `ev`.`created_date`  LIKE '%$sSearch%'
                    OR  `ev`.`expert_title`  LIKE '%$sSearch%'
                    OR  `s`.`segment`  LIKE '%$sSearch%')";
            }
    

    【讨论】:

      【解决方案3】:

      这样试试

      $this->db->where("(`u`.`first_name`LIKE '%a%'OR `u`.`last_name` LIKE '%a%' OR `ev`.`created_date`  LIKE '%a%' OR  `ev`.`expert_title`  LIKE '%a%' OR `s`.`segment`  LIKE '%a%')");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-07
        • 1970-01-01
        • 2013-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多