mysql分组取每组前几条记录(排名)
1.创建表
create table tb(
name varchar(10),
val int,
memo varchar(20)
);
2.插入数据
insert into tb values('a', 2, 'a2(a的第二个值)');
insert into tb values('a', 1, 'a1--a的第一个值');
insert into tb values('a', 3, 'a3:a的第三个值');
insert into tb values('b', 1, 'b1--b的第一个值');
insert into tb values('b', 3, 'b3:b的第三个值');
insert into tb values('b', 2, 'b2b2b2b2');
insert into tb values('b', 4, 'b4b4');
insert into tb values('b', 5, 'b5b5b5b5b5');
3.按name分组取val最大的值所在行的数据
# 方法4:
SELECT a.* FROM tb AS a
INNER JOIN
(SELECT name , max(val) val FROM tb GROUP BY name) AS b
ON a.name = b.name
AND a.val = b.val
ORDER BY a.name ;
--方法1:
select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name ;
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val) ;
--方法3:
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name ;
--方法4:
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name ;
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name ;
4.按name分组取val最小的值所在行的数据
--方法1:
select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name ;
--方法2:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val) ;
--方法3:
select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name ;
--方法4:
select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name ;
--方法5
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name ;
**5.按name分组取最小的两个(N个)val **
select a.* from tb a
where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2)
order by a.name ;
**6.按name分组取最大的两个(N个)val **
select a.* from tb a
where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2)
order by a.name
创建表
CREATE TABLE `mygoods` (
`goods_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`cat_id` int(11) NOT NULL DEFAULT '0',
`price` tinyint(3) NOT NULL DEFAULT '0',
`status` tinyint(3) DEFAULT '1',
PRIMARY KEY (`goods_id`),
KEY `icatid` (`cat_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入数据
INSERT INTO `mygoods` VALUES (1, 101, 90, 0);
INSERT INTO `mygoods` VALUES (2, 101, 99, 1);
INSERT INTO `mygoods` VALUES (3, 102, 98, 0);
INSERT INTO `mygoods` VALUES (4, 103, 96, 0);
INSERT INTO `mygoods` VALUES (5, 102, 95, 0);
INSERT INTO `mygoods` VALUES (6, 102, 94, 1);
INSERT INTO `mygoods` VALUES (7, 102, 93, 1);
INSERT INTO `mygoods` VALUES (8, 103, 99, 1);
INSERT INTO `mygoods` VALUES (9, 103, 98, 1);
INSERT INTO `mygoods` VALUES (10, 103, 97, 1);
INSERT INTO `mygoods` VALUES (11, 104, 96, 1);
INSERT INTO `mygoods` VALUES (12, 104, 95, 1);
INSERT INTO `mygoods` VALUES (13, 104, 94, 1);
INSERT INTO `mygoods` VALUES (15, 101, 92, 1);
INSERT INTO `mygoods` VALUES (16, 101, 93, 1);
INSERT INTO `mygoods` VALUES (17, 101, 94, 0);
INSERT INTO `mygoods` VALUES (18, 102, 99, 1);
INSERT INTO `mygoods` VALUES (19, 105, 85, 1);
INSERT INTO `mygoods` VALUES (20, 105, 89, 0);
INSERT INTO `mygoods` VALUES (21, 105, 99, 1);
表mygoods为商品表,cat_id为分类id,goods_id为商品id,status为商品当前的状态位(1:有效,0:无效)
sql查询语句
-- 每个分类找出价格最高的两个商品
select a.* from mygoods a
where (select count(*) from mygoods where cat_id = a.cat_id and price > a.price ) <3
order by a.cat_id,a.price desc;
-- 每个分类找出价格最高的有效的两个商品(正确)
select a.* from mygoods a
where (select count(*) from mygoods where cat_id = a.cat_id and price > a.price and status=1 ) <3
and status=1
order by a.cat_id, a.price desc ;
-- 可以将每个分组下的goods_id合并
select cat_id,GROUP_CONCAT(goods_id) from mygoods group by cat_id;
-- 每个分类找出价格最高的商品
select a.* from mygoods a where price = (select max(price) from mygoods where cat_id=a.cat_id) order by a.cat_id;
-- 每个分类找出价格最低的商品
select a.* from mygoods a where price = (select min(price) from mygoods where cat_id=a.cat_id) order by a.cat_id;
mysql分组取每组前几条记录(排名)的更多相关文章
- mysql分组取每组前几条记录(排序)
首先来造一部分数据,表mygoods为商品表,cat_id为分类id,goods_id为商品id,status为商品当前的状态位(1:有效,0:无效). CREATE TABLE `mygoods` ...
- mysql单列去重复group by分组取每组前几条记录加order by排序
mysql分组取每组前几条记录(排名) 附group by与order by的研究,需要的朋友可以参考下 --按某一字段分组取最大(小)值所在行的数据 复制代码代码如下: /* 数据如下: name ...
- Mysql SQL分组取每组前几条记录
按name分组取最大的两个val: [比当前记录val大的条数]小于2条:即当前记录为为分组中的前两条 > (select count(*) from tb where name = a.nam ...
- MYSQL 按某个字段分组,然后取每组前3条记录
先初始化一些数据,表名为 test ,字段及数据为: SQL执行结果为:每个 uid 都只有 3 条记录. SQL语句为: SELECT * FROM test main WHERE ...
- SQL分组取每组前一(或几)条记录(排名)
mysql分组取每组前几条记录(排名) 附group by与order by的研究 http://www.jb51.net/article/31590.htm --按某一字段分组取最大(小)值所在行的 ...
- mysql查询各种类型的前N条记录
mysql查询各种类型的前N条记录,将3改为N(需查询条数)即可 (select * from event_info where event_type = 1 limit 3)union all( ...
- mysql获取所有分类的前n条记录的两种方法浅析
项目中有个需求是获取出展会分类下的前n条展商. 刚开始的思路是用group by 获取出展会的分类,后面再根据分类获取该分类下的n个展商,但也需要第一次获取出展会的时候也获取所有的每个展会分类下的 ...
- MySQL 分组后取每组前N条数据
与oracle的 rownumber() over(partition by xxx order by xxx )语句类似,即:对表分组后排序 创建测试emp表 1 2 3 4 5 6 7 8 9 ...
- MySQL 先按某字段分组,再取每组中前N条记录
按 gpcode每组 取每组 f4 最大的那条记录: 方法一: select * from calcgsdataflash a where gscode = 'LS_F' and ymd >= ...
随机推荐
- php-fpm配置详解
php-fpm详解 原文链接:http://php-fpm.anight.org/wiki:http://www.php-fpm.com/翻译:http://syre.blogbus.com/logs ...
- 设计模式_EventObject和EventListener
一.事件机制基本概念 java中的事件机制的参与者有3种角色: 1.event object:事件状态对象,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中 2. ...
- Nmap笔记本
nmap -vv 192.168.1.100 -p1-65535 跑1-65535的端口并且设置对结果的详细输出 nmap -vv 192.168.1.1/8 -p 1433 --open 跑开放14 ...
- C++ 类模板四(typename关键字)
- 开发人员需知的Web缓存知识(转)
什么是Web缓存,为什么要使用它? 缓存的类型: 浏览器缓存: 代理服务器缓存: 网关缓存: Web缓存无害吗?为什么要鼓励缓存? Web缓存如何工作 如何控制缓存和不缓存: HTML Meta标签 ...
- ProtocolBuffer在Android端的解析
开题篇 近期公司在使用Protocol Buffer替代原先的json作为移动端的数据交互格式.虽然服务端和CTO把这项新技术吹的天花乱坠,说什么体积小,不易被破解乱七八糟的.可是作为Android端 ...
- c# @符号后面对 双引号转义
本文讲述c#中如何转义双引号. c#中转义双引号",使用的转义字符仍然是\. string str = "\"www.itjsxx.com\""; 但 ...
- mybatis 处理 mysql 表中的 text类型的 字段
在mysql 中 text类型的字段: service_detail text NULL 服务描述 . 对应java文件中 model 中的 String: private String ser ...
- 面试题思考:什么是基于注解的切面实现?(AOP是Aspect Oriented Program的首字母缩写)
首先解释下AOP :在程序运行时,动态的将代码切入到类的指定方法.指定位置上的编程思想就是面向切面编程 一般而言,我们管切入到指定类指定方法的代码片段为切面,而切入的哪些类.哪些方法则叫切入点.有了A ...
- Eclipse获取签名证书的SHA1
签名后的获取方式 :http://jingyan.baidu.com/article/3ea51489da3bc252e71bba59.html 未签名的获取方式:http://www.th7.cn/ ...