zoukankan      html  css  js  c++  java
  • mysql中distinct的用法

    本事例实验用表task,结构如下

     MySQL> desc task;

    +-------------+------------+------+-----+-------------------+-------+

    | Field       | Type       | Null | Key | Default           | Extra |

    +-------------+------------+------+-----+-------------------+-------+

    | PLAYER_ID   | bigint(20) | NO   | PRI | NULL              |       |

    | TASK_ID     | int(11)    | NO  | PRI | NULL              |       |

    | TASK_STATUS | tinyint(4) |NO   |    | NULL              |       |

    | CREATE_DATE | datetime   | YES |     | NULL              |       |

    | UPDATE_DATE |timestamp  | NO   |    | CURRENT_TIMESTAMP |       |

    +-------------+------------+------+-----+-------------------+-------+

      

    1  Distinct 位置

      单独的distinct只能放在开头,否则报错,语法错误

    mysql> Select  player_id,distinct(task_id) from task;

    ERROR 1064 (42000): You havean error in your SQL syntax; check the manual that

    corresponds to your MySQLserver version for the right syntax to use near 'disti

    nct(task_id) from task' atline 1

    现在把distinct放在开头

    mysql> Select  distinct(task_id),taskid from task;

    查询成功

    与其他函数使用时候,没有位置限制如下

      Select player_id,count(distinct(task_id))from task;

    这种情况下是正确的,可以使用。

    2  Distinct用法

    a.在count计算不重复的记录的时候能用到
    比如SELECT COUNT( DISTINCT player_id ) FROM task;
    就是计算talbebname表中id不同的记录有多少条

    b,在需要返回记录不同的id的具体值的时候可以用
    比如SELECT DISTINCT player_id FROM task;
    返回talbebname表中不同的id的具体的值

    c.上面的情况2对于需要返回mysql表中2列以上的结果时会有歧义
    比如SELECT DISTINCT player_id, task_id FROM task;
    实际上返回的是player_id与task_id同时不相同的结果,也就是DISTINCT同时作用了两个字段,必须得player_id与task_id都相同的才被排除了,与我们期望的结果不一样,我们期望的是player_id不同被过滤

      在这种情况下,distinct同时作用了两个字段,player_id,task_id

    d.这时候可以考虑使用group_concat函数来进行排除,不过这个mysql函数是在mysql4.1以上才支持的

    e. 其实还有另外一种解决方式,就是使用
    SELECT player_id, task_id, count(DISTINCT player_id) FROM task.
    虽然这样的返回结果多了一列无用的count数据(有时也许就需要这个数据)

    f 同时我们还可以利用下面的方式解决b遇到的歧义问题通过group by 分组

      select player_id,task_id from task group by player_id

    distinct 优化

    请参考:http://isky000.com/database/mysql_distinct_implement 

    对distinct的原理 及优化分析的很好,大家可以查看。

  • 相关阅读:
    [机器学习案例1]基于KNN手写数字识别
    Android横竖屏切换View设置不同尺寸或等比例缩放的XML解决方案
    Qt之网络编程
    Redis系列-存储篇sorted set主要操作函数小结
    Code First Migrations更新数据库结构的具体步骤
    json文件解析
    go语言文件操作
    docker容器与主机之间的文件复制
    ubuntu16.04 安装docker
    Go语言string,int,int64 ,float之间类型转换方法
  • 原文地址:https://www.cnblogs.com/lushilin/p/6187743.html
Copyright © 2011-2022 走看看