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) |