distinct 是 sql 关键字,用于去除查询结果中重复行,非 php 功能;仅对 select 后字段组合去重,可配合 count 统计唯一值,比 php 层去重更高效;与 group by 语义不同,纯去重优先用 distinct;多字段时按组合去重,非单字段独立去重。

PHP 中使用 DISTINCT 主要是为了从数据库查询结果中去除重复行,它不是 PHP 自身的功能,而是 SQL 语句的一部分,通过 PHP 的数据库扩展(如 MySQLi 或 PDO)执行。关键在于理解什么时候该用、怎么写才准确有效。
去重单字段值,比如获取所有不重复的用户名或分类
当业务需要列出“所有出现过的用户昵称”或“商品所属的所有类别”,而原始表中这些字段存在大量重复时,DISTINCT 最直接有效。
示例(PDO):
SELECT DISTINCT username FROM users;注意:只对 SELECT 后面列出的字段组合去重。如果写成 SELECT DISTINCT username, email,那么只有 username 和 email 都完全相同时才算重复。
立即学习“PHP免费学习笔记(深入)”;
配合 COUNT 统计唯一值数量
想知道某字段有多少个不同取值(如“平台共有多少个省份的用户”),用 COUNT(DISTINCT field) 比先查出再用 PHP 去重更高效。
示例:
51shop 由 PHP 语言开发, 使用快速的 MySQL 数据库保存数据 ,为中小型网站实现网上电子商务提供一个完美的解决方案.一、用户模块1. 用户注册:用户信息包括:用户ID、用户名、用户密码、性别、邮箱、省份、城市、 联系电话等信息,用户注册后不能立即使用,需由管理员激活账号,才可使用(此功能管理员可设置)2. 登录功能3. 资料修改:用户可修改除账号以后的所有资料4. 忘记密码:要求用
这种写法避免了把大量数据拉到 PHP 层处理,减少内存占用和网络传输开销。
与 GROUP BY 混用需谨慎,多数情况 DISTINCT 更简洁
有人误以为 GROUP BY field 和 SELECT DISTINCT field 效果一样,其实不然。前者是分组聚合的基础,常配合 SUM、AVG 等函数;后者只是单纯去重。
如果只需要去重,不用聚合计算,优先用 DISTINCT —— 语义清晰、性能通常更好、SQL 更简短。
-
SELECT DISTINCT category FROM products;✔️ 纯去重 -
SELECT category FROM products GROUP BY category;⚠️ 功能等效但冗余,且后续加聚合函数时才体现价值
多字段去重要注意逻辑含义
DISTINCT 作用于整个 SELECT 列表。例如 SELECT DISTINCT status, created_date FROM orders,表示“状态+创建日期”这一组合唯一,不是各自单独去重。
若想分别获取所有 status 和所有 created_date,得发两条查询,或用 UNION(需字段类型兼容):
SELECT 'status' AS type, status AS value FROM orders GROUP BY statusUNION
SELECT 'date' AS type, DATE(created_date) AS value FROM orders GROUP BY DATE(created_date);
这种场景下,DISTINCT 不适用,需换思路。










