distinct未去重的根本原因是作用于整行而非单字段,只要其他列值不同整行即视为不同;解决方法是只查需去重字段或改用group by配合聚合函数。
SELECT DISTINCT 为什么没去重?
常见现象是写了 SELECT DISTINCT name,结果还是看到重复的 name 值。根本原因是:DISTINCT 作用于整行,不是单个字段。只要其他列(比如 id、created_at)不同,整行就视为不同,哪怕 name 相同也会被保留。
解决办法只有两个方向:
- 明确只查需要去重的字段,且不带其他可能变化的列(如
SELECT DISTINCT name FROM user) - 若必须带其他字段,改用
GROUP BY name配合聚合函数(如MAX(id)),再做后续处理 - 注意 MySQL 5.7+ 默认开启
ONLY_FULL_GROUP_BY,直接SELECT name, id FROM user GROUP BY name会报错,需显式指定聚合逻辑
PHP 中执行 DISTINCT 查询的典型写法
和普通查询无本质区别,重点在 SQL 本身是否写对。PDO 示例:
$stmt = $pdo->prepare("SELECT DISTINCT category FROM products WHERE status = ?");
$stmt->execute([1]);
$categories = $stmt->fetchAll(PDO::FETCH_COLUMN);
关键点: