`
wzping
  • 浏览: 103100 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SQL中distinct的用法

阅读更多
在使用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之前,不然会报错,差不多了,我继续忙碌。。。。。。
分享到:
评论
6 楼 ken2008huang 2011-10-13  
分享一个转载的,希望对大家有用
sql去除重复列(行)http://hi.baidu.com/ken2008huang/blog/item/7e449760ed1a1ec38cb10d21.html
5 楼 ken2008huang 2011-10-13  
oracle中行不通奥~
4 楼 董瑞龙 2010-09-25  
谢谢 谢谢
3 楼 zhanghenanjuly 2010-08-26  
如果sql语句中有外连接了,这个distinct好像就不好使了
2 楼 baby8117628 2010-08-24  
Select uid,headImg,realname From Members Where emailcheck=1  group by realname order by uid desc limit 3

其实我觉得那个 count 没必要要的。 我这个也可以 呵呵
1 楼 tzhnihao 2010-08-23  
你好,这个问题耽误我很久了,楼主的无私精神值得我学习。oracle中是否也能这样用?

相关推荐

    mysql中distinct用法【SQL中distinct的用法】.docx

    MySQL 中 DISTINCT 用法详解 MySQL 中的 DISTINCT 关键字用于返回唯一不同的值,避免重复值的出现。当我们在查询表中数据时,可能会遇到重复值的情况,这时使用 DISTINCT 关键字可以帮助我们返回唯一的值。 ...

    小度写范文【SQL中distinct的用法】mysql中distinct用法模板.docx

    在MySQL中,`DISTINCT`的使用方式和功能与其他SQL数据库系统(如SQL Server、Access等)大体相同,但有一些细微的差别。以下是对`DISTINCT`用法的详细解释: 1. **单列去重**: 当我们需要从一个表中获取唯一的某...

    小度写范文【SQL中distinct的用法】mysql中distinct用法模板.pdf

    以下是关于`DISTINCT`在SQL中的具体用法和一些注意事项。 1. **单列去重** 当我们只对单一列应用`DISTINCT`时,它将去除该列中的重复值。例如,在表`A`中,如果我们执行`SELECT DISTINCT name FROM A`,那么返回的...

    SQL中distinct的用法(四种示例分析)

    在SQL查询中,`DISTINCT` 是一个非常重要的关键字,用于去除结果集中的重复行,只保留唯一的记录。本文将详细解析 `DISTINCT` 的四种典型用法,并通过实例进行说明,帮助理解如何有效地利用 `DISTINCT` 处理数据。 ...

    SQL select distinct的使用方法

    本篇文章将详细讲解`DISTINCT` 的使用方法,并结合具体的例子进行阐述。 首先,让我们来看一个基本的 `DISTINCT` 用法。假设我们有一个名为 `A` 的表格,其中包含以下数据: ``` | name | id | | ------ | -- | | ...

    sqlserver中distinct的用法(不重复的记录)

    总的来说,`DISTINCT` 在 SQL Server 中是一个强大的工具,但使用时需要谨慎,特别是在处理大数据量时,要考虑到其对性能的影响。合理地使用索引、聚合函数和其他查询技术,可以有效地提高查询效率并减少资源消耗。

    完美解决distinct中使用多个字段的方法

    完美解决distinct中使用多个字段的方法,完美解决distinct中使用多个字段的方法完美解决distinct中使用多个字段的方法完美解决distinct中使用多个字段的方法完美解决distinct中使用多个字段的方法

    sql中exists的用法

    SQL 中 EXISTS 的用法简介 exists 是 SQL 中最常用的子查询操作符之一,用于检测子查询是否返回至少一个记录。exists 的使用场景非常广泛,包括对多表之间的关系进行查询、检测记录的存在性等。 在 SQL 中,exists...

    分析MySQL中优化distinct的技巧

    MySQL的执行计划显示,原始SQL语句`SELECT COUNT(DISTINCT nick) FROM user_access`使用了`ind_user_access`索引进行全扫描,这意味着数据库需要遍历整个索引来获取不重复的`nick`值。这显然是低效的,因为即使使用...

    select distinct用法

    select distinct用法 在SQL中,SELECT语句中的DISTINCT关键字的用法是一...DISTINCT关键字的用法是一个非常重要的知识点,在实际应用中,我们需要了解和掌握DISTINCT关键字的使用方法和限制,以便更好地解决实际问题。

    SQL中distinct 和 row_number() over() 的区别及用法

    在SQL中,`DISTINCT`和`ROW_NUMBER() OVER()`都是用来处理数据集的独特性,但它们的用途和机制有所不同。`DISTINCT`是一个关键字,主要用于去除查询结果中的重复行,确保返回的每一行在指定的列上都是唯一的。而`ROW...

    使用Distinct查询.rar

    `DISTINCT`是SQL中用于获取唯一数据的重要工具,可以单独使用,也可以与`WHERE`, `GROUP BY`等配合使用。在实际应用中,理解其工作原理,结合索引和优化策略,能够有效提升查询效率,同时满足业务需求。正确使用`...

    sql/having用法

    SQL中的HAVING子句用法 HAVING子句是SQL中的一种子句,用于对 GROUP BY 子句所确定的行组进行控制。HAVING 子句条件中只允许涉及常量、聚组函数或 GROUP BY 子句中的列。在 Oracle 中,HAVING 子句是对 GROUP BY ...

    oracle中distinct的用法详解

    在Oracle数据库中,`DISTINCT` 是一个非常重要的SQL关键字,用于从查询结果中去除重复的行。在本文中,我们将深入探讨`DISTINCT`的用法及其在不同情况下的应用。 首先,让我们看一个简单的例子。假设我们有一个名为...

    SQL SELECT DISTINCT 语句

    SQL中的`SELECT DISTINCT`语句是用于从查询结果中去除重复的行,只保留唯一的、不重复的值。这个功能在处理数据时非常有用,特别是当你需要统计或分析不重复的记录时。以下是对`SELECT DISTINCT`语句的详细解释和...

    23.Oracle的distinct关键字1

    在本例中,我们将通过创建一个名为`T_GIRL`的超女基本信息表,并插入一些测试数据来演示`DISTINCT`关键字的使用方法。 首先,我们创建了`T_GIRL`表,包含了超女的编号`id`、姓名`name`、颜值`yz`、身材`sc`、体重`...

Global site tag (gtag.js) - Google Analytics