权游游牧族:众所周知!一句SqL语句不能先排序再分组。所以这里给出几个案例

--表结构--
create table `shop` (
`id` int (10) PRIMARY KEY,
`shop_name` varchar (100),
`item_name` varchar (100),
`price` int (10)
); insert into `shop` (`id`, `shop_name`, `item_name`,`price`) values('1','小卖部','酱油','12');
insert into `shop` (`id`, `shop_name`, `item_name`,`price`) values('2','小卖部','醋','15');
insert into `shop` (`id`, `shop_name`, `item_name`,`price`) values('3','小卖部','脉动','20');
insert into `shop` (`id`, `shop_name`, `item_name`,`price`) values('4','小卖部','沙姜','2');
insert into `shop` (`id`, `shop_name`, `item_name`,`price`) values('5','超市','猪肉','24');
insert into `shop` (`id`, `shop_name`, `item_name`,`price`) values('6','超市','生菜','6');
insert into `shop` (`id`, `shop_name`, `item_name`,`price`) values('7','超市','菜心','5');
insert into `shop` (`id`, `shop_name`, `item_name`,`price`) values('8','连锁店','生姜','3');
insert into `shop` (`id`, `shop_name`, `item_name`,`price`) values('9','超市','牛肉','30');
insert into `shop` (`id`, `shop_name`, `item_name`,`price`) values('10','连锁店','蒜头','2');
insert into `shop` (`id`, `shop_name`, `item_name`,`price`) values('11','连锁店','黄瓜','20');

对价格price进行排序然后再根据商店类型shop_name进行分组查询

select * from (select * from shop order by price desc) a GROUP BY a.shop_name

结果只是按照表数据的顺序,简单地进行了分组查询操作,但是这时候我们还不能下结论说这条sql就是错误的,我们用另一个数据库版本(MySql 5.5.57)测试一下。

最后放上相应的解决办法:


-方法一,仅适用于低于5.7版本的MySql--
select * from (select * from shop order by price desc) a GROUP BY a.shop_name; --方法二--
select * from (select * from shop order by price desc limit 999999) a GROUP BY a.shop_name; --方法三--
select * from shop a where N > (select count(*) from shop b where b.shop_name = a.shop_name and a.price < b.price) order by a.shop_name,a.price desc;

PS:方法二中使用limit,需要limit的范围足够大能包括所有数据,并且每种分类只会显示一条数据,但是数据较多时运行效率要比方法三快上很多,方法三能够控制每种分类显示多少条数据,把N换成需要显示对应的数字即可。

阅读原文

mysql 怎样先排序再分组的更多相关文章

  1. MySql下实现先排序后分组

    最近在工作中遇到一个先排序后分组的需求,发现MySql不同的版本有不同的结果,特此记录. 举例:要求在shop表中查询出各类型商店中价格最高的商品. --表结构-- create table `sho ...

  2. MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作)

    MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作): a.创建2张表 create table userinfo(nid int not nul ...

  3. MySQL进阶5--分组函数 / 分组排序和分组查询 group by(having) /order by

    MySQL进阶--分组排序和分组查询 group by(having) /order by /* 介绍分组函数 功能:用做统计使用,又称为聚合函数或组函数 1.分类: sum, avg 求和 /平均数 ...

  4. MYSQL 排序和分组

    一.MYSQL 中有两种排序方式: 1:通过有序索引顺序扫描直接返回有序数据,这种方式在使用explain 分析查询的时候显示为Using Index ,不需要额外的排序,操作效率较高. 2: 是通过 ...

  5. MySQL在按照某个字段分组、排序加序号

    事情是这样的,最近领导给了一个新的需求,要求在一张订单表中统计每个人第一次和第二次购买的时间间隔,最后还需要按照间隔统计计数,求出中位数等数据. 由于MySQL不想Oracle那般支持行号.中位数等, ...

  6. MySQL全面瓦解10:分组查询和聚合函数

    概述 相信我们经常会遇到这样的场景:想要了解双十一天猫购买化妆品的人员中平均消费额度是多少(这可能有利于对商品价格区间的定位):或者不同年龄段的化妆品消费占比是多少(这可能有助于对商品备货量的预估). ...

  7. DQL语句排序与分组

    DQL语句排序与分组 一.DQL-排序 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列.分内部排序和外部排序,若整个 ...

  8. LINQ之路14:LINQ Operators之排序和分组(Ordering and Grouping)

    本篇继续LINQ Operators的介绍,这里要讨论的是LINQ中的排序和分组功能.LINQ的排序操作符有:OrderBy, OrderByDescending, ThenBy, 和ThenByDe ...

  9. MySQL对数据表进行分组查询

    MySQL对数据表进行分组查询(GROUP BY) GROUP BY关键字可以将查询结果按照某个字段或多个字段进行分组.字段中值相等的为一组.基本的语法格式如下: GROUP BY 属性名 [HAVI ...

随机推荐

  1. 《Android源代码设计模式解析与实战》读书笔记(十八)

    第十八章.代理模式 代理模式也称托付模式,是结构型设计模式之中的一个.是应用广泛的模式之中的一个. 1.定义 为其它对象提供一种代理以控制对这个对象的訪问. 2.使用场景 当无法或不想直接訪问某个对象 ...

  2. linux下jdk的安装和配置

    一.首先依据自己的系统位数在网上下载对应的jdk安装包 下载地址例如以下:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-do ...

  3. iOS UITableView 去除多余切割线

    在UITableView初始化时加上下面代码就可以: self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero ...

  4. luogu3469 [POI2008]BLO_Blockade

    题目大意 给一个无向连通图,求对于每一个点,去掉该点后图中连通结点有序对的减少量. 思路 当时想这道题时,我想到:枚举每一个点,在删去它后连通的几个部分中Dfs得到各个部分的点的个数从而得到解,但是我 ...

  5. luogu2331 [SCOI2005]最大子矩阵

    题目大意 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠.1≤n≤100,1≤m≤2,1≤k≤10. 思路 #include < ...

  6. Androlid入门之文件系统操作(三)文件读写

         import java.io.*; import android.app.Activity; import android.os.Bundle; import android.view.Vi ...

  7. wireshark解析rtp协议,流媒体中的AMR/H263/H264包的方法

    抓到完整的流媒体包之后,用wireshark打开,其中的包可能不会自动映射成RTP+AMR/H263/H264的包,做如下修改操作即可:1.  把UDP 包解析成RTP/RTCP包.选中UDP包,右键 ...

  8. Java图形用户界面编程

    1.Java图形用户界面编程概述 JavaAPI中提供了两套组件用于支持编写图形用户界面:AWT(抽象窗口包)和Swing 2.  容器(Container):重量级容器和轻量级容器(一个容器可以放置 ...

  9. openstack 性能优化极致

  10. Docker从安装部署到Hello World

    Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源.Docker 是一个开源的 ...