萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql 去除重復記錄sql語句詳解

mysql 去除重復記錄sql語句詳解

在mysql去除重復記錄的方法有很多,同時mysql還帶了一個DISTINCT關鍵字就可以了,下面我來給大家詳細介紹介紹 去除重復記錄sql語句吧,有需要了解的朋友可參考。

SQL SELECT DISTINCT 語句


語法:

SELECT DISTINCT 列名稱 FROM 表名稱使用 DISTINCT 關鍵詞

如果要從 "Company" 列中選取所有的值,我們需要使用 SELECT 語句:

SELECT Company FROM Orders

如需從 Company" 列中僅選取唯一不同的值,我們需要使用 SELECT DISTINCT 語句:

 代碼如下 復制代碼


SELECT DISTINCT Company FROM Orders


下面先來看看例子:

table
id name
1 a
2 b
3 c
4 c
5 b

庫結構大概這樣,這只是一個簡單的例子,實際情況會復雜得多。

比如我想用一條語句查詢得到name不重復的所有數據,那就必須使用distinct去掉多余的重復記錄。

 代碼如下 復制代碼

select distinct name from table
得到的結果是:

name
a
b
c

好像達到效果了,可是,我想要得到的是id值呢?改一下查詢語句吧:

 代碼如下 復制代碼

select distinct name, id from table

結果會是:

id name
1 a
2 b
3 c
4 c
5 b

distinct怎麼沒起作用?作用是起了的,不過他同時作用了兩個字段,也就是必須得id與name都相同的才會被排除

突然靈機一閃,既然可以使用group_concat函數,那其它函數能行嗎?

趕緊用count函數一試,成功,我。。。。。。。想哭啊,費了這麼多工夫。。。。。。。。原來就這麼簡單。。。。。。

現在將完整語句放出:

 代碼如下 復制代碼

select *, count(distinct name) from table group by name

結果:

id name count(distinct name)
1 a 1
2 b 1
3 c 1

最後一項是多余的,不用管就行了,目的達到。。。。。

唉,原來mysql這麼笨,輕輕一下就把他騙過去了,郁悶也就我吧(對了,還有容容那家伙),現在拿出來希望大家不要被這問題折騰。

哦,對,再順便說一句,group by 必須放在 order by 和 limit之前,不然會報錯。。。。。。。。!OK了


補充:

經過本人測試 select *, count(distinct name) from table group by name 就可以了。


查找所有重復數據

 代碼如下 復制代碼 /* 查找所有重復數據 */
SELECT `t1`.*
FROM `t1`,(
  SELECT `name`,`add`
  FROM `t1`
  GROUP BY `name`,`add`
  HAVING COUNT(1) > 1
) AS `t2`
WHERE `t1`.`name` = `t2`.`name`
  AND `t1`.`add` = `t2`.`add`;
+----+------+-----+
| 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 |
+----+------+-----+
 rows in set (0.00 sec)


查找除id最小的數據外的重復數據

 代碼如下 復制代碼

/* 查找除id最小的數據外的重復數據 */
SELECT `t1`.*
FROM `t1`,(
  SELECT DISTINCT MIN(`id`) AS `id`,`name`,`add`
  FROM `t1`
  GROUP BY `name`,`add`
  HAVING COUNT(1) > 1
) AS `t2`
WHERE `t1`.`name` = `t2`.`name`
  AND `t1`.`add` = `t2`.`add`
  AND `t1`.`id` <> `t2`.`id`;
+----+------+-----+
| id | name | add |
+----+------+-----+
|  2 | abc  | 123 |
|  4 | abc  | 123 |
|  7 | xzy  | 456 |
|  8 | xzy  | 456 |
| 11 | xzy  | 789 |
| 13 | ijk  | 147 |
| 20 | tpk  | 963 |
| 22 | wer  | 546 |
+----+------+-----+
 rows in set (0.00 sec)

copyright © 萬盛學電腦網 all rights reserved