You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询:为重复邮箱返回单个唯一ID而非全部重复ID

解决重复邮箱返回单个对应ID的SQL方案

通用方案(适用于MySQL、SQL Server、Oracle等多数数据库)

使用GROUP BY结合聚合函数,直接为每个重复邮箱取任意一个ID(这里以取最小ID为例,换成MAX(id)可取最大ID):

SELECT MIN(id) AS id, email
FROM users
GROUP BY email
HAVING COUNT(email) > 1;

原理:GROUP BY email将相同邮箱的记录分组,HAVING COUNT(email) > 1筛选出存在重复的邮箱分组,MIN(id)提取每组内的最小ID,满足你"返回其中一个ID"的需求。

灵活控制方案(窗口函数实现)

如果需要更灵活地指定返回哪个ID(比如按创建时间排序取最新/最早),可以用窗口函数ROW_NUMBER():

SELECT id, email
FROM (
    SELECT 
        id, 
        email,
        -- 按邮箱分组,每组内按ID排序并编号
        ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
    FROM users
) t
-- 取每组的第一条记录,同时筛选出有重复的邮箱
WHERE rn = 1 
  AND email IN (SELECT email FROM users GROUP BY email HAVING COUNT(email) > 1);

PostgreSQL专属简化方案

如果你用的是PostgreSQL,DISTINCT ON语法可以更简洁地实现:

SELECT DISTINCT ON (email) id, email
FROM users
WHERE email IN (
    SELECT email FROM users GROUP BY email HAVING COUNT(email) > 1
)
-- 按邮箱分组后,按ID排序取第一条
ORDER BY email, id;

你的原语句问题说明

你之前写的SELECT id FROM (SELECT distinct(email), id from users where email = email);无法生效的原因:

  1. WHERE email = email是无效条件,不会过滤任何数据;
  2. DISTINCT是对整行去重,由于id是唯一字段,每一行都是唯一的,子查询会返回所有记录,外层自然也会拿到所有ID,完全达不到去重邮箱并取单个ID的目的。

内容的提问来源于stack exchange,提问作者akaAlso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:02:12