【问题标题】:Codeigniter using LIKE with WHERE in SQL queryCodeigniter 在 SQL 查询中使用 LIKE 和 WHERE
【发布时间】:2015-10-18 11:13:16
【问题描述】:

在 codeigniter 中,我有一个这样的查询:

    $this->db->select('*', false);
    $this->db->from('video as v');
    $this->db->where('v.start_date <=', 'NOW()', false);
    $this->db->like('v.title', $keywords);
    $this->db->or_like('v.title_tw', $keywords);
    $this->db->or_like('v.title_cn', $keywords);
    $query = $this->db->get();
    return $query->result_array();

在我的期望中:

start_date <= NOW **AND** title like $keywords OR title_tw like $keywords OR title_cn like $keywords

然而,结果却是:

start_date <= NOW **OR** title like $keywords OR title_tw like $keywords OR title_cn like $keywords

如何解决这个问题?非常感谢。

更新:

实际查询:

function search_video($keywords) {
    $this->db->select('v.*,t.name,t.name_tw,t.name_cn, t.image_url as profile_pic, COALESCE(b.duration, bt.duration, bc.duration) AS duration, COALESCE(b.thumbnail, bt.thumbnail, bc.thumbnail) as thumbnail', false);
    $this->db->from('video as v');
    $this->db->join('teacher as t', 'v.teacher_id = t.id');
    $this->db->join('video_tag as vt', 'v.id = vt.video_id', 'left');
    $this->db->join('brightcove as b', 'v.video = b.video_id', 'left');
    $this->db->join('brightcove as bt', 'v.video_tw = bt.video_id', 'left');
    $this->db->join('brightcove as bc', 'v.video_cn = bc.video_id', 'left');
    $this->db->where('v.is_delete', false);
    $this->db->where('v.start_date <=', 'NOW()', false);
    $this->db->like('v.title', $keywords);
    $this->db->or_like('v.title_tw', $keywords);
    $this->db->or_like('v.title_cn', $keywords);
    $this->db->or_like('vt.tag', $keywords);
    $this->db->group_by('v.id');
    $query = $this->db->get();
    return $query->result_array();
}

【问题讨论】:

    标签: php mysql sql codeigniter


    【解决方案1】:

    对于 CodeIgniter 3.x:

    您可以使用Query grouping 在查询中使用括号:

        $this->db->select('v.*,t.name,t.name_tw,t.name_cn, t.image_url as profile_pic, COALESCE(b.duration, bt.duration, bc.duration) AS duration, COALESCE(b.thumbnail, bt.thumbnail, bc.thumbnail) as thumbnail', false);
            $this->db->from('video as v');
            $this->db->join('teacher as t', 'v.teacher_id = t.id');
            $this->db->join('video_tag as vt', 'v.id = vt.video_id', 'left');
            $this->db->join('brightcove as b', 'v.video = b.video_id', 'left');
            $this->db->join('brightcove as bt', 'v.video_tw = bt.video_id', 'left');
            $this->db->join('brightcove as bc', 'v.video_cn = bc.video_id', 'left');
            $this->db->where('v.is_delete', false);
            $this->db->where('v.start_date <=', 'NOW()', false);
            $this->db->group_start();
            $this->db->like('v.title', $keywords);
            $this->db->or_like('v.title_tw', $keywords);
            $this->db->or_like('v.title_cn', $keywords);
            $this->db->or_like('vt.tag', $keywords);
            $this->db->group_end();
            $this->db->group_by('v.id');
            $query = $this->db->get();
    

    对于 CodeIgniter 2.x:

    虽然我没有对其进行测试,但我只是认为这应该可以工作:

    $this->db->select('v.*,t.name,t.name_tw,t.name_cn, t.image_url as profile_pic, COALESCE(b.duration, bt.duration, bc.duration) AS duration, COALESCE(b.thumbnail, bt.thumbnail, bc.thumbnail) as thumbnail', false);
        $this->db->from('video as v');
        $this->db->join('teacher as t', 'v.teacher_id = t.id');
        $this->db->join('video_tag as vt', 'v.id = vt.video_id', 'left');
        $this->db->join('brightcove as b', 'v.video = b.video_id', 'left');
        $this->db->join('brightcove as bt', 'v.video_tw = bt.video_id', 'left');
        $this->db->join('brightcove as bc', 'v.video_cn = bc.video_id', 'left');
        $this->db->where('v.is_delete', false);
        $this->db->where('v.start_date <=', 'NOW()', false);
        $this->db->where("( v.title LIKE '%{$keywords}%'", null, FALSE);
        $this->db->or_like('v.title_tw', $keywords);
        $this->db->or_like('v.title_cn', $keywords);
        $this->db->where("OR vt.tag LIKE '%{$keywords}%' )", null, FALSE);
        $this->db->group_by('v.id');
    

    【讨论】:

    • 谢谢,但发现当前的 codeigniter 是 2.x.x,有什么解决方法吗?谢谢
    【解决方案2】:

    你可以这样试试:

    $sql = SELECT * FROM video as v where v.start_date <= NOW() AND (v.title like ? OR v.title_tw like ? or v.title_cn like ?);
    $query = $this->db->query($sql, array($keywords, $keywords, $keywords));
    

    【讨论】:

    • 非常感谢您的帮助。问题是实际查询非常复杂,因此使用单行查询可能不是那么简单
    • @user782104 - 好的,我看到您使用实际查询进行的新编辑。您仍然应该能够使用代表每个$keywords 输入的? 参数定义完整的SQL 查询,并使用db-&gt;query() 方法,因为其他所有内容都是静态的。无论如何,也许是一个选择。
    【解决方案3】:

    最后我创建了这样的查询,看起来工作正常:

    function search_video($keywords) {
        $this->db->select('v.*,t.name,t.name_tw,t.name_cn, t.image_url as profile_pic, COALESCE(b.duration, bt.duration, bc.duration) AS duration, COALESCE(b.thumbnail, bt.thumbnail, bc.thumbnail) as thumbnail', false);
        $this->db->from('video as v');
        $this->db->join('teacher as t', 'v.teacher_id = t.id');
        $this->db->join('video_tag as vt', 'v.id = vt.video_id', 'left');
        $this->db->join('brightcove as b', 'v.video = b.video_id', 'left');
        $this->db->join('brightcove as bt', 'v.video_tw = bt.video_id', 'left');
        $this->db->join('brightcove as bc', 'v.video_cn = bc.video_id', 'left');
        $this->db->where("(v.is_delete = false AND v.start_date <= NOW()) AND (v.title LIKE '$keywords' OR  v.title_tw LIKE '$keywords' OR v.title_cn LIKE '$keywords' OR vt.tag LIKE '$keywords')");
        $this->db->group_by('v.id');
        $query = $this->db->get();
        return $query->result_array();
    }
    

    非常感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2013-10-10
      • 2015-11-28
      相关资源
      最近更新 更多