用distinct在MySQL中查询多条不重复记录值[转]

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但
往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让
我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。所以我花
了很多时间来研究这个问题,网上也查不到解决方案,期间把朋友拉来帮忙,结果是我们两人都郁闷了!

下面先来看看例子:

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都相同的才会被排除……

我们再改改查询语句:

select id, distinct name from table

很遗憾,除了错误信息你什么也得不到,distinct必须放在开头。难到不能把distinct放到where条件里?能,照样报错。。。。。。。

很麻烦吧?确实,费尽心思都没能解决这个问题。没办法,继续找人问。

拉住公司里一JAVA程序员,他给我演示了oracle里使用distinct之后,也没找到mysql里的解决方案,最后下班之前他建议我试试group by。

试了半天,也不行,最后在mysql手册里找到一个用法,用group_concat(distinct name)配合group by name实现了我所需要的功能,兴奋,天佑我也,赶快试试。

报错。。。。。。。。。。。。郁闷。。。。。。。连mysql手册也跟我过不去,先给了我希望,然后又把我推向失望,好狠哪。。。。

再仔细一查,group_concat函数是4.1支持,晕,我4.0的。没办法,升级,升完级一试,成功。。。。。。

终于搞定了,不过这样一来,又必须要求客户也升级了。

突然灵机一闪,既然可以使用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之前,不然会报错.

更郁闷的事情发生了,在准备提交时容容发现,有更简单的解决方法:

select id, name from table group by name

看来对mysql的了解还是太肤浅了,不怕被笑话,发出来让大家别犯同样的错误。

时间: 2024-09-16 05:46:18

用distinct在MySQL中查询多条不重复记录值[转]的相关文章

用Distinct在MySQL中查询多条不重复记录值

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来 过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值.其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说 ,无疑是会直接影响到效率的.所以我花了很多时间来研究这个问题,网上也查不到解决方案,期间把 朋友拉来帮忙,

使用distinct在mysql中查询多条不重复记录值的解决办法_Mysql

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值.其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的.所以我花了很多时间来研究这个问题,网上也查不到解决方案,期间把容容拉来帮忙,结果是

select-关于mysql中查询重复数据的疑问

问题描述 关于mysql中查询重复数据的疑问 我有一个表叫做sc. 现在要查询score中有相同分数的信息, 查询的sql语句是 select * from sc where score in (select score from sc group by score having count(score)>1); 我很好奇的是group by的执行顺序是比 having先执行啊, 按道理,执行了之后重复的score值是没有的,怎么还能再用having 来查出count(score)>1 的重复

mysql-JSP怎么获取在MySql中查询到的数据中的指定值?

问题描述 JSP怎么获取在MySql中查询到的数据中的指定值? 这是我的table结构,一共6列,主键是id,table名是user,现在想通过查找username来获取指定username的name值,并存入session中,用SELECT * FROM user where 语句可以获取一行值,如果我只要取name列的值,代码应该怎么写呢?比如我想取username为zeng的用户的name值,应当怎么写?之前遇到个问题卡了很久,提问求个例子之后大家都只说个大概思路,无奈只好把问题拆分开来问

php-PHP无法在MySQL中查询中文数据

问题描述 PHP无法在MySQL中查询中文数据 跪求大神来回答!我的PHP脚本已经实现了MySQL数据库的链接.但是发现在HTML页面上输入中文查询,显示的是数据库中没有这个信息. 但其实我的MySQL里面有这条中文数据的.网上说的设置utf8,gbkgb2312我都试过了,也没有用. 我的并不是说页面显示中文乱码,而是数据库中无法执行查询中文这一操作.希望大神能帮个忙! 解决方案 $inputData = iconv(""GB2312""UTF-8"&q

hql在mysql中查询出错

问题描述 hql在mysql中查询出错 今天遇到一个非常奇怪的问题,mysql数据库,hibernate注解配置表, from Wxyhdtb where zt=1 and wxyh.id=1 order by wxyh.id 测试发现在where条件中wxyh.id会出错,Unknown column 'wxyh.id' in 'where clause',但是只在order by wxyh.id却没有问题 ,请问这是什么情况? 注:以前用oracle 就不会出现这种情况 解决方案 Mysql

mysql怎么查询10-20条的数据

问题描述 mysql怎么查询10-20条的数据 mysql怎么查询1-5条的数据?????????????????? 解决方案 select * from table limit 0, 5 select * from table limit 10, 20 解决方案二: 在select语句后面使用limit

php实现只保留mysql中最新1000条记录

  这篇文章主要介绍了php实现只保留mysql中最新1000条记录的方法和相关示例及数据库结构,十分的全面,有需要的小伙伴可以参考下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?php mysql_connect("localhost","root","root"); mysql_select_db("test"); //保留最新的1000条记录

入门php在mysql中查询数据

问题描述 入门php在mysql中查询数据 数据库中有张表有主键pmcode还有其他属性,我现在想通过pmcode判断某个用户是否存在,存在的话将其信息取出,代码如下: //拆分发来的信息得到会员卡号 $arry=explode("+",$form_Content); $memberid =$arry[1]; //连接数据库 $link=mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_