SELECT* FROM mytable mto WHEREEXISTS ( SELECT1 FROM mytable mti WHERE mti.varchar_column = mto.varchar_column LIMIT 1, 1 ) ORDERBY varchar_column;
步骤:
对外部查询的每一行,在子查询中查找是否存在相同varchar_column值的第二行记录。
若存在,则外部查询返回该行记录。
最后按varchar_column列排序。
方法四:获取重复行的ID
1 2 3 4
SELECT GROUP_CONCAT(id), name, COUNT(*) c FROM documents GROUPBY name HAVING c >1;
步骤:
按name列分组。
统计每组记录数。
筛选出记录数大于1的组。
使用GROUP_CONCAT(id)函数将每组的id连接成一个字符串。
方法五:使用子查询和IN关键字
1 2 3 4
SELECT*FROMtable WHERE field IN ( SELECT field FROMtableGROUPBY field HAVINGcount(*) >1 ) ORDERBY field;
步骤:
子查询找出field列的重复值。
外部查询根据子查询结果,筛选出field列值为重复值的记录。
按field列排序。
方法六:多列组合查找重复值
1 2 3 4 5 6
SELECTCOUNT(CONCAT(name,email)) AS tot, name, email FROM users GROUPBY CONCAT(name,email) HAVING tot>1;
步骤:
使用CONCAT函数将name和email列的值连接成一个字符串。
按连接后的字符串分组。
统计每组记录数。
筛选出记录数大于1的组。
方法七:使用窗口函数(MySQL 8.0+)
1 2 3 4 5 6 7 8 9
WITH cte AS ( SELECT* ,COUNT(*) OVER(PARTITIONBY col_name) AS num_of_duplicates_group ,ROW_NUMBER() OVER(PARTITIONBY col_name ORDERBY col_name2) AS pos_in_group FROMtable ) SELECT* FROM cte WHERE num_of_duplicates_group >1;