CodeIgniter中含UNION与ORDER BY的MySQL查询实现问题
在CodeIgniter中实现你的UNION查询
嘿,我来帮你搞定这个问题!你的原生MySQL查询逻辑是完全没问题的,在CodeIgniter里可以通过两种简单的方式实现:直接执行原生SQL(最省心的方式),或者用框架的查询构建器来拼接。
方法一:直接执行原生SQL(推荐)
CodeIgniter支持直接运行原生SQL语句,还能通过参数绑定来避免SQL注入,同时自动处理特殊字符(比如你语句里的®)。代码示例如下:
// 定义SQL语句,用?作为参数占位符 $sql = "(SELECT * FROM videos WHERE Autor = ? ORDER BY RAND() LIMIT 10) UNION (SELECT * FROM videos WHERE Categoría = ? AND Autor <> ? ORDER BY RAND() LIMIT 5)"; // 准备参数数组,对应占位符的顺序 $params = ['LittleBabyBum ® Español', 'Música - Niños', 'LittleBabyBum ® Español']; // 执行查询并获取结果 $query = $this->db->query($sql, $params); $results = $query->result(); // 返回对象数组,需要关联数组的话用$result_array()
这种方式完全复用了你原本的SQL逻辑,不用纠结查询构建器的语法限制,同时参数绑定也更安全。
方法二:使用CodeIgniter查询构建器
如果你想遵循框架的查询风格,可以分别构建两个子查询,再通过union()方法合并:
// 构建第一个子查询:获取指定作者的10条随机视频 $this->db->select('*') ->from('videos') ->where("Autor = 'LittleBabyBum ® Español'") ->order_by('RAND()') ->limit(10); // 启用UNION合并 $this->db->union(); // 构建第二个子查询:获取指定分类且排除指定作者的5条随机视频 $this->db->select('*') ->from('videos') ->where("Categoría = 'Música - Niños'") ->where("Autor <> 'LittleBabyBum ® Español'") ->order_by('RAND()') ->limit(5); // 执行合并后的查询 $query = $this->db->get(); $results = $query->result();
小提醒
- 确保两个子查询返回的列数和数据类型完全一致,这是UNION查询的硬性要求,否则会报错。
- 如果需要保留重复结果(你的场景里应该不需要),可以用
union_all()代替union()。 - 参数绑定的方式比直接拼接字符串更安全,能避免SQL注入风险,也能自动处理特殊字符的转义。
内容的提问来源于stack exchange,提问作者CJara
相关产品推荐
相关产品推荐

