CodeIgniter 的 distinct() 是查询构建器方法,生成 SELECT DISTINCT SQL 语句由数据库去重;支持单字段、多字段组合去重,可结合 where、order_by 等链式方法使用,但不可与 select('*') 混用,也不支持按字段去重取首条完整记录。

CodeIgniter 中的 distinct() 是查询构建器提供的一个链式方法,用于在 SELECT 查询中去除重复行,效果等同于 SQL 的 SELECT DISTINCT。它不执行去重逻辑本身,而是生成带 DISTINCT 关键字的 SQL 语句,由数据库引擎完成实际去重。
基本用法:单字段去重
对某一个字段取唯一值,比如获取所有不重复的部门名称:
- 在控制器中调用:
$this->db->distinct()->select('department')->from('employees')->get()->result(); - 等效原生 SQL:
SELECT DISTINCT department FROM employees; - 注意:
distinct()必须放在select()之前或之后(推荐之前),且仅对select()指定的字段生效
多字段组合去重
当需要基于多个字段共同判断唯一性时(例如“城市+国家”组合不能重复):
- 写法:
$this->db->distinct()->select('city, country')->from('customers')->get()->result(); - 等效 SQL:
SELECT DISTINCT city, country FROM customers; - 关键点:去重依据是字段组合的完整值,不是每个字段单独去重;只要其中任一字段不同,整行即视为不重复
结合条件与排序使用
实际业务中常需加 WHERE 过滤、ORDER BY 排序,distinct() 可与其他链式方法共存:
- 示例:查出状态为 'active' 的用户中所有不重复的邮箱域名:
$this->db->distinct()->select("SUBSTRING_INDEX(email, '@', -1) as domain")->from('users')->where('status', 'active')->order_by('domain')->get()->result(); - 注意:若使用了函数或表达式(如
SUBSTRING_INDEX),需确保数据库支持该函数,且别名要在select()中明确定义
常见误区与注意事项
distinct() 看似简单,但容易踩坑:
- 不能和
select('*')混用去重预期——若表含主键,每行主键都不同,SELECT DISTINCT *几乎不生效 - 不支持委派(如 Power Apps 中的 Distinct 函数),CodeIgniter 的
distinct()完全依赖数据库执行,无性能警告提示 - 若需“按某字段去重,同时取该组第一条完整记录”,
distinct()无法满足——应改用GROUP BY+ 聚合函数(如MIN(id))或窗口函数 - 查询结果为空时返回空数组,不会报错;建议用
num_rows()判断是否有数据

















