表结构及数据:
SELECT * FROM `t1`;+----+------+-----+
| id | name | add |
+----+------+-----+
| 1 | abc | 123 |
| 2 | abc | 123 |
| 3 | abc | 321 |
| 4 | abc | 123 |
| 5 | xzy | 123 |
| 6 | xzy | 456 |
| 7 | xzy | 456 |
| 8 | xzy | 456 |
| 9 | xzy | 789 |
| 10 | xzy | 987 |
| 11 | xzy | 789 |
| 12 | ijk | 147 |
| 13 | ijk | 147 |
| 14 | ijk | 852 |
| 15 | opq | 852 |
| 16 | opq | 963 |
| 17 | opq | 741 |
| 18 | tpk | 741 |
| 19 | tpk | 963 |
| 20 | tpk | 963 |
| 21 | wer | 546 |
| 22 | wer | 546 |
| 23 | once | 546 |
+----+------+-----+
/* 查找重复数据有哪些种类 */
SELECTf_name,
f_content
FROM
t1
GROUP BY
f_name,
f_content
HAVING COUNT(1) > 1 /*此句也可写成 having count(f_name || f_content) > 1*/
| name | add |
+------+-----+
| abc | 123 |
| ijk | 147 |
| tpk | 963 |
| wer | 546 |
| xzy | 456 |
| xzy | 789 |
+------+-----+
/* 查找所有重复数据 */
SELECTt1.*
FROM
t1,
(
SELECT
f_name,
f_content
FROM
t1
GROUP BY
f_name,
f_content
HAVING COUNT(1) > 1
) AS t2
WHERE
t1.f_name = t2.f_name
AND t1.f_content = t2.f_content;
以上部分还可写成如下形式,更好理解一些。。。
SELECT
t1.id,
t1.f_name,
t1.f_content
FROM
t1
inner join
(
SELECT
f_name,
f_content
FROM
t1
group by
f_name,
f_content
having count(f_name || f_content) > 1
) t2
on t1.f_name = t2.f_name
and t1.f_content = t2.f_content
;
| id | name | add |
+----+------+-----+
| 1 | abc | 123 |
| 2 | abc | 123 |
| 4 | abc | 123 |
| 6 | xzy | 456 |
| 7 | xzy | 456 |
| 8 | xzy | 456 |
| 9 | xzy | 789 |
| 11 | xzy | 789 |
| 12 | ijk | 147 |
| 13 | ijk | 147 |
| 19 | tpk | 963 |
| 20 | tpk | 963 |
| 21 | wer | 546 |
| 22 | wer | 546 |
+----+------+-----+