惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
SecWiki News
SecWiki News
Forbes - Security
Forbes - Security
N
News | PayPal Newsroom
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
V
V2EX - 技术
S
Secure Thoughts
W
WeLiveSecurity
Google DeepMind News
Google DeepMind News
C
CERT Recently Published Vulnerability Notes
NISL@THU
NISL@THU
S
Securelist
S
Security Archives - TechRepublic
Know Your Adversary
Know Your Adversary
V
Vulnerabilities – Threatpost
Security Latest
Security Latest
Recent Commits to openclaw:main
Recent Commits to openclaw:main
G
GRAHAM CLULEY
H
Hacker News: Front Page
Microsoft Azure Blog
Microsoft Azure Blog
I
Intezer
Google Online Security Blog
Google Online Security Blog
美团技术团队
阮一峰的网络日志
阮一峰的网络日志
T
The Exploit Database - CXSecurity.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Webroot Blog
Webroot Blog
Jina AI
Jina AI
Engineering at Meta
Engineering at Meta
P
Proofpoint News Feed
The Cloudflare Blog
I
InfoQ
L
LangChain Blog
U
Unit 42
P
Proofpoint News Feed
S
Schneier on Security
S
Security Affairs
Y
Y Combinator Blog
T
Tenable Blog
N
News and Events Feed by Topic
MyScale Blog
MyScale Blog
量子位
Google DeepMind News
Google DeepMind News
Cyberwarzone
Cyberwarzone
博客园 - 聂微东
D
Darknet – Hacking Tools, Hacker News & Cyber Security
GbyAI
GbyAI
AWS News Blog
AWS News Blog

行迹小栈

英语十大词法汇总 - 行迹小栈 保定市林草生态园 - 行迹小栈 【北京】-八达岭长城 - 行迹小栈 【北京】-颐和园 - 行迹小栈 【上海】 - 行迹小栈 【唐山市】河头老街-唐山宴-唐山地震博物馆 - 行迹小栈 【天津】 - 行迹小栈 【北京】-天安门 - 行迹小栈 【张家口】-蔚县 - 行迹小栈 🐍 Python ORM 技术选型指南: SQLAlchemy 与 SQLModel - 行迹小栈 python提取excel中的超链接 - 行迹小栈 CentOS7通过rpm安装docker和docker compose - 行迹小栈 Requests verify=False 报错:InsecureRequestWarning: Unverified HTTPS request is being made to host - 行迹小栈 centos7 初始化脚本 - 行迹小栈 Vmware centos7 配置静态网络 - 行迹小栈 我的瘢痕疙瘩治疗过程记录 - 行迹小栈 关于瘢痕疙瘩-为什么-治疗方案-如何预防 - 行迹小栈 javascript基础教程 - 行迹小栈 python使用subprocess配合node.js执行js代码 - 行迹小栈
Mysql查询:每个重复数据,只显示一条 - 行迹小栈
行迹小栈 · 2025-08-22 · via 行迹小栈

前言

Mysql查询:每个重复数据,只显示一条,通过使用 min(id)实现是一个非常经典和高效的方法!这通常用于在有自增主键(如 id)的表中,从重复数据中保留“最老”或“最早”插入的那一条记录。

下面我为您详细介绍如何使用 MIN(id) 来实现“每个重复数据只显示一条”。


场景假设

假设我们有一个用户表 users,结构如下:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100),
    age INT
);

表中有一些重复的 email 数据:

id name email age
1 Alice alice@email.com 25
2 Bob bob@email.com 30
3 Alice alice@email.com 26
4 Carol carol@email.com 28
5 Bob bob@email.com 32

我们希望根据 email 字段去重,保留每个 email 对应的 id 最小的那条记录


方法一:使用 MIN(id) + GROUP BY(推荐用于查询)

如果您只是想查询去重后的数据(不修改原表),可以使用:

SELECT MIN(id) AS id, name, email, age
FROM users
GROUP BY email;

结果

id name email age
1 Alice alice@email.com 25
2 Bob bob@email.com 30
4 Carol carol@email.com 28

注意:这里有一个重要细节!虽然我们 GROUP BY email,但 nameage 并不在 GROUP BY 子句中。在 MySQL 的宽松模式下,这会返回每个分组中第一条遇到的记录的 nameage。由于我们使用了 MIN(id),通常第一条就是 id 最小的那条,所以结果是正确的。

但在 SQL 严格模式(如 ONLY_FULL_GROUP_BY)下,这种写法会报错。更严谨的写法是结合子查询。


方法二:使用子查询(最严谨,推荐)

为了确保结果的准确性和兼容性,推荐使用子查询先找出每个 email 对应的最小 id,然后再关联查询完整数据:

SELECT u.id, u.name, u.email, u.age
FROM users u
INNER JOIN (
    SELECT email, MIN(id) AS min_id
    FROM users
    GROUP BY email
) t ON u.email = t.email AND u.id = t.min_id;

结果(同上):

id name email age
1 Alice alice@email.com 25
2 Bob bob@email.com 30
4 Carol carol@email.com 28

优点

  • 逻辑清晰,结果准确。
  • 兼容所有 SQL 模式。
  • 可以轻松扩展到多字段去重。

方法三:删除重复数据(保留最小 id)

如果您想永久删除重复数据,只保留 id 最小的那条,可以使用:

DELETE u1 FROM users u1
INNER JOIN users u2
WHERE u1.email = u2.email
  AND u1.id > u2.id;

这条语句的逻辑是:对于每一对具有相同 email 的记录,如果 u1id 大于 u2id,就删除 u1。最终只保留 id 最小的那条。


总结

  • MIN(id) 是一个非常实用的技巧,它利用了自增主键的特性来确定“第一条”记录。
  • 对于查询,推荐使用方法二(子查询),因为它最严谨。
  • 对于删除重复数据,推荐使用方法三(自连接删除)
  • 您的想法“通过使用 min(id) 实现”完全正确,并且是数据库去重的最佳实践之一。👍