MySQL去重需求:查询时chapter字段不重复,按章节展示注册名称
嘿,这个需求挺常见的,我给你分两种场景来解决——一种是用SQL直接输出聚合后的结果,另一种是在应用层实现更美观的分层展示,你可以根据自己的实际情况选:
解决方案
1. SQL聚合函数实现(单条结果行展示章节+注册名列表)
如果只是想把同一章节的所有注册名合并成一个列表,直接用各数据库对应的字符串聚合函数就能搞定,查询结果里每个章节只出现一次,后面跟着对应的注册名集合:
MySQL/MariaDB
SELECT chapter, GROUP_CONCAT(registration_name SEPARATOR ', ') AS registration_names FROM your_table_name GROUP BY chapter ORDER BY chapter;
你可以把分隔符改成换行符(SEPARATOR '\n'),如果用的是支持换行显示的数据库客户端,就能看到章节和注册名的分层效果。
PostgreSQL
PostgreSQL用STRING_AGG,还能顺便给注册名排序:
SELECT chapter, STRING_AGG(registration_name, ', ' ORDER BY registration_name) AS registration_names FROM your_table_name GROUP BY chapter ORDER BY chapter;
SQL Server(2017及以上版本)
SQL Server同样支持STRING_AGG,语法稍微有点不同:
SELECT chapter, STRING_AGG(registration_name, ', ') WITHIN GROUP (ORDER BY registration_name) AS registration_names FROM your_table_name GROUP BY chapter ORDER BY chapter;
2. 应用层处理(实现章节单独换行+注册名列表的格式)
如果想要更直观的分层展示,比如这样的效果:
章节A
- 注册名1
- 注册名2
章节B- 注册名3
那更推荐在应用代码里处理,先查所有排序好的数据,再通过代码逻辑控制显示格式:
首先执行基础查询(按章节排序,确保同一章节的注册名排在一起):
SELECT chapter, registration_name FROM your_table_name ORDER BY chapter, registration_name;
然后用你熟悉的编程语言遍历结果,维护一个当前章节的变量,当章节切换时打印新的章节名,下面逐个输出注册名。举个Python的简单示例:
# 这里以PostgreSQL为例,其他数据库的驱动用法类似 import psycopg2 # 连接数据库 conn = psycopg2.connect("dbname=你的数据库名 user=你的用户名 password=你的密码") cur = conn.cursor() # 执行查询 cur.execute("SELECT chapter, registration_name FROM your_table_name ORDER BY chapter, registration_name") current_chapter = None # 遍历结果并格式化输出 for chapter, reg_name in cur.fetchall(): if chapter != current_chapter: # 章节切换时,打印新的章节名 print(f"\n**{chapter}**") current_chapter = chapter # 打印当前章节下的注册名 print(f"- {reg_name}") # 关闭连接 cur.close() conn.close()
这样就能完美实现你想要的“每个章节名仅显示一次,下方展示对应注册名称列表”的效果啦。
内容的提问来源于stack exchange,提问作者Abdullah Oqdah
相关产品推荐
相关产品推荐

