Mysql 分组选择

在其他的数据库中我们遇到分组选择的问题时,比如在分组中计算前10名的平均分

我们可以使用row_number()over() 比较方便的得到。

但是在mysql中,问题就被抛了出来,因为mysql并没有一个rownum内建数据元组访问方式。

在这里我提供三种方式来尝试解决

一.最基础的union的方式,放弃分组,采用union方式将多条查询的结果集放在一起做后续操作。   虽然我们可以在程序中预先获取所有分组,循环拼凑sql语句,但是这依然是很繁琐费时的,而且在目标需要分的组是海量的将会非常消耗系统资源。

二.使用采用子查询的方式,

例子

在上述语句中使用了一个子查询(select count(*))得到一个cnt数,这个数实际上是可以反映这条数据元组在他所在分组所排名名次的。

这种方式看似很美好,实际上子查询的效率出奇的烂,我实际跑起来,感觉mysql5.6对这样查询并没有多上优化,给每一条记录给出一个‘伪排名值’,天知道有多浪费资源。

三.使用group_concat()与substring_index配合解决

例子

Select  substring_index(group_concat(report_period order by report_period desc),',',1) 。。。

通过一个额外的字段存放group_concat(),我们可以后续取出各个分组中对应排名的值,这可以算做一种化纵为橫。由于我们本来分组就要使用group by所以,group_concat()括号中的属性如果与外部的group by的属性一致并不会带来明显的开销增加。

不过由于返回的并不直接是我们需要的元组,而是一个排序属性值所以需要,在外嵌套一层查询

Mysql 分组选择的更多相关文章

  1. 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式

    单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式     一 表结构如下:  万行 CREATE TABLE t_audit_operate_log (  Fid b ...

  2. Oracle和MySQL分组查询GROUP BY

    Oracle和MySQL分组查询GROUP BY 真题1.Oracle和MySQL中的分组(GROUP BY)有什么区别? 答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段 ...

  3. mysql 分组和聚合函数

    mysql 分组和聚合函数 Mysql 聚集函数有5个: 1.COUNT() 记录个数(count(1),count(*)统计表中行数,count(列名)统计列中非null数) 2.MAX() 最大值 ...

  4. mysql 分组内 排序

    mysql 分组内 排序 类似于 sqlserver over partition by   因为mysql中木有sqlserver over partition by这个函数,要从sqlserver ...

  5. MySQL索引选择不正确并详细解析OPTIMIZER_TRACE格式

    一 表结构如下: CREATE TABLE t_audit_operate_log (  Fid bigint(16) AUTO_INCREMENT,  Fcreate_time int(10) un ...

  6. 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式

    一 表结构如下:  万行 CREATE TABLE t_audit_operate_log (  Fid bigint(16) AUTO_INCREMENT,  Fcreate_time int(10 ...

  7. mysql分组取最大(最小、最新、前N条)条记录

    在数据库开发过程中,我们要为每种类型的数据取出前几条记录,或者是取最新.最小.最大等等,这个该如何实现呢,本文章向大家介绍如何实现mysql分组取最大(最小.最新.前N条)条记录.需要的可以参考一下. ...

  8. MySQL如何选择合适的索引

    先来看一个栗子 EXPLAIN select * from employees where name > 'a'; 如果用name索引查找数据需要遍历name字段联合索引树,然后根据遍历出来的主 ...

  9. Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!

    这是Mysql系列第9篇. 环境:mysql5.7.25,cmd命令中进行演示. 本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区 ...

随机推荐

  1. ES6 —— 数组总结

    1. map:映射   一个对一个 arr.map(function(item) { ... })    可以配合箭头函数:arr.map(item => ... ) let arr1 = [1 ...

  2. 小程序——如何引入外部js

    当写小程序需要引入一些额外的js文件时,可以这样: 一.先把外部js用一个函数封闭起来: test.js function myfunc() { console.log("myfunc... ...

  3. list quen队列

    队列特性:先进先出 stack 栈先进后出 push() 输入 pop()输出 set接口 collectonjiek list接口:可重复集(可以用下标取值) set接口:不可重复集(没下标) Ha ...

  4. 深入理解Python字符编码

    不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError.UnicodeDecodeError 错误,每当遇到错误我们就拿着 enc ...

  5. 数学paper写作注意事项

    [转载请注明出处]http://www.cnblogs.com/mashiqi 2019/03/20 Introduction一定要好好写,写好后要至少读一遍,保证流畅.editor会读introdu ...

  6. linux三剑客之grep

    linux基础三剑客之grep 1.grep命令 基本介绍 grep命令是文本本过滤工具,是基于一个模式匹配文件的每一行,grep分类:egrep个fgrep. grep英文名:Global  sea ...

  7. angular6实现对象转换数组对象

    1 使用表单获取到数据以后,是对象类型的数据如下图 而后台需要返回的数据是这种key:value的形式传入 2   废话不多说直接上代码(代码只截取部分,仅供参考跑不起来,最后又一个小demo可以运行 ...

  8. 我的代码-date

    # coding: utf-8 # In[24]: import timeimport datetimelocaltime = time.asctime( time.localtime(time.ti ...

  9. Android自定义标签列表控件LabelsView解析

    版权声明:本文为博主原创文章,未经博主允许不得转载. 无论是在移动端的App,还是在前端的网页,我们经常会看到下面这种标签的列表效果:   标签从左到右摆放,一行显示不下时自动换行.这样的效果用And ...

  10. javascript 4.2

    element.value="......"也可以为属性设置新的值 setAttribute()方法是“第一级DOM”的组成部分之一,DOM是适用于多种环境和多种程序设计语言的通用 ...