mysql distinct

摘要:
尽管MySQL提供了关键字distinct以过滤掉冗余的重复记录并仅保留一条,但它通常仅用于返回非重复记录的数量。原因是,distinct只能返回其目标字段。例如,我希望使用不重复名称的语句查询所有数据。然后,必须使用distinct来删除冗余的重复记录。也就是说,只能排除具有相同ID和名称的用户。很难将区别放在何处。

在使用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之前,不然会报错。。。。。。。。!OK了


select *,count(DISTINCT (recived_time)) from p_recived where user_id=3377 GROUP BY recived_time


select *,GROUP_CONCAT(DISTINCT (recived_time)) from p_recived where user_id=3377 GROUP BY recived_time

免责声明:文章转载自《mysql distinct》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇wpf 定时器应用,在界面动态刷新时间2014年可用的TRACKER服务器大全下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iView组件添加API中介绍的事件的方式(render方式添加事件)

iView组件好用,文档齐全,品质可靠稳定。最大的好处是使用了Vue框架,使很多数据绑定和交互问题变的轻松,是难得的开源前端组件。给作者点个赞。用这个组件来学习Vue.js也是不错的选择。 最近用的比较多。碰到的主要问题是绑定事件,试了很多种写法,可能是对vue不太了解,一直没试对。最终发现写法其实很简单。 用现成的组件,比如API里写了一个事件是on-c...

php mysql jquery ajax 查询数据库三级联动

1、php 页面打开直接展示第一个select option中的数据 2、当第一个下拉列表选中的内容发生改变的时候,查询数据库填充第二个下拉列表 3、当第二个下拉列表选中的内容发生改变时,查询数据库填充第三个下拉列表 注意点: 1、查询出来的数据,如果绑定到select上 2、select cochange事件 3、ajax 请求,提交到某个php 页面,...

linux日常工作积累(常见命令、常见安装、常见问题)

2 常用命令 2.1查询IP:/sbin/ifconfig [root@localhost Desktop]# /sbin/ifconfig //ip地址 2.2 移动:mv 原目录/文件 新目录/文件 [root@localhost Desktop]# mv /home/jianglili/Desktop/webshell-master /usr/l...

Linux操作系统Centos7.2版本搭建Apache+PHP+Mysql环境

对于在校大学生来说腾讯云1元主机很划算,所以就申请了一台,打算在上面学习下linux,使用版本为centos7.2版本。在服务器上比较推荐centos,此版本生命周期较长,而且网上有关centos的教程很多,方便学习。 Centos6版本的推荐看下面这个教程,很详细 http://blog.csdn.net/u014427391/article/detai...

【技术贴】java插入mysql中文乱码解决|java插入mysql数据库显示问号?

【技术贴】java插入mysql中文乱码解决|java插入mysql数据库显示问号? 在你要连接到mysql 的代码里写上?useUnicode=true&characterEncoding=UTF-8" 比如 "jdbc:mysql://localhost:3306/chenluancl1?useUnicode=true&characte...

scrapy爬虫成长日记之将抓取内容写入mysql数据库

前面小试了一下scrapy抓取博客园的博客(您可在此查看scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据),但是前面抓取的数据时保存为json格式的文本文件中的。这很显然不满足我们日常的实际应用,接下来看下如何将抓取的内容保存在常见的mysql数据库中吧。 说明:所有的操作都是在“scrapy爬虫成长日记之创建工程-抽取数据-保存为j...