数据库distinct返回不重复的多个字段结果

本文探讨了在SQL查询中如何使用distinct关键字返回多个字段的不重复记录。通常distinct仅用于去除单一字段的重复,但在需要获取多个字段不重复组合的情况下,通过结合聚合函数可以实现这一目标。文中通过示例展示了如何处理这一问题,从而在不影响效率的前提下,正确获取数据库中name和id的不重复组合。

在使用数据库时,有时需要查询出某个字段不重复的记录,虽然数据库提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。
其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的数据库来说,无疑是会直接影响到效率的。
下面先来看看例子:

//表的结构 'member`'
CREATE TABLE IF NOT EXISTS 'member'  
( 'uid' int(7) NOT NULL AUTO_INCREMENT,  
  'username' varchar(8) DEFAULT NULL,  
  'telephone' varchar(11) DEFAULT NULL,  
  PRIMARY KEY ('uid') ) 
 ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2003879

下面我们存入10条数据:

//转存表中的数据 'member'  
INSERT INTO 'member' ('uid', 'username', 'telephone')  
VALUES (2003875, 'qsdcz', '12345678902'),  
(10034, 'asdf', '13989775873'),  
(10023, 'qwer', '13989775873'), 
(10039, 'edcvfr', '13267864587'),  
(2003874, '234jhkus', '18701395130'), 
(10982, '234jhkus', '18783493002'), 
(12234, 'cfdfv', '13687879832'), 
(2003876, NULL, '12345678901'),  
(2003877, 'wertyuu', '12345678901'), 
(2003878, 'rtyuijkd', '12345678901'); 

库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。

比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。

select distinct telephone from table 

telephone的结果是:

12345678901 
12345678902   
13267864587   
13687879832    
13989775873   
18701395130   
18783493002 

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

select distinct telephone,uid,username from table 

结果会是:

uid username telephone 
2003875 qsdcz 12345678902 
10034 asdf 13989775873  
10023 qwer 13989775873  
10039 edcvfr 13267864587  
2003874 234jhkus 18701395130 
10982 234jhkus 18783493002  
12234 cfdfv 13687879832  
2003876 sdf 12345678901 
2003877 wertyuu 12345678901 
2003878 rtyuijkd 12345678901

distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段,也就是必须得id与name都相同的才会被排除。我们再改改查询语句:

select id, distinct name from table 

很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。
该怎么办呢?我们用函数统计需要不重复的字段。居然成功了。
现在将完整语句放出:

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

结果:

uid username telephone 
2003878 rtyuijkd 12345678901 
2003875 qsdcz 12345678902 
10039 edcvfr 13267864587 
12234 cfdfv 13687879832  
10023 qwer 13989775873 
2003874 234jhkus 18701395130 
0982 234jhkus 18783493002 

目的达到。能够解决问题就可以了。但是我也不知道是什么原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值