MySQL distinct 返回其他字段

2021-10-08 14:56:47 字數 1504 閱讀 9213

前倆天接到乙個**面試,被面試官的乙個複雜sql語句問題給問懵逼了,今日回想,還是準備的不夠充分啊!這次就查漏補缺吧!

言歸正傳,在使用mysql時,有時需要查詢出某個欄位不重複的記錄,雖然mysql提供有distinct這個關鍵字來過濾掉多餘的重覆記錄只保留一條,但往往只用它來返回不重覆記錄的條數,而不是用它來返回不重記錄的所有值。

distinct 只能返回它的目標字段,而無法返回其它欄位.用 distinct 不能解決的話,我只有用二重迴圈查詢來解決,而這樣對於乙個資料量非常大的站來說,無疑是會直接影響到效率的。

這裡有乙個 使用 distinct 返回其他欄位的方法。

下面先來看看例子:table 表

id name

1  a

2  b

3  c

4  c

5  b

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

比如我想用一條語句查詢得到name不重複的所有資料,那就必須使用 distinct 去掉多餘的重覆記錄。

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

nameab

c

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

select distinct name, id from table;
結果會是:

id name

1  a

2  b

3  c

4  c

5  b

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

我們再改改查詢語句:

select id, distinct name from table;
很遺憾,除了錯誤資訊你什麼也得不到,distinct必須放在開頭。難到不能把distinct放到where條件裡?能,照樣報錯。。。。。。。

在mysql手冊裡找到乙個用法,用group_concat(distinct name)配合group by name可以實現實現了。

select *,group_concat(distinct name) from table group by name;
用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 DISTINCT 的實現與優化

distinct 實際上和 group by 的操作非常相似,只不過是在 group by 之後的每組中只取出一條記錄而已。所以,distinct 的實現和 group by 的實現也基本差不多,沒有太大的區別。同樣可以通過鬆散索引掃瞄或者是緊湊索引掃瞄來實現,當然,在無法僅僅使用索引即能完成 di...

MySQL Distinct 去掉查詢結果重覆記錄

出處 使用 distinct 關鍵字可以去掉查詢中某個欄位的重覆記錄。語法 select distinct column from tb name例子 假定 user 表有如下記錄 uidusername1小李 2小張3小李 4小王5小李 6小張sql 語句 select distinct user...

MySQL DISTINCT 去重(過濾重複資料)

在使用 mysql select 語句查詢資料的時候返回的是所有匹配的行。例如,查詢 tb students info 表中所有 age 的執行結果如下所示。mysql select age from tb students info age 25 23 23 22 24 21 22 23 22 2...