mysql分组取每组前几条记录(排序)
首先来造一部分数据,表mygoods为商品表,cat_id为分类id,goods_id为商品id,status为商品当前的状态位(1:有效,0:无效)。
CREATE TABLE `mygoods` (
`goods_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`cat_id` int(11) NOT NULL DEFAULT '',
`price` tinyint(3) NOT NULL DEFAULT '',
`status` tinyint(3) DEFAULT '',
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);
需求:每个分类下,找出两个价格最高的有效的商品。
1. 每个分类找出价格最高的两个商品
mysql> select a.*
-> from mygoods a
-> where (select count(*)
-> from mygoods
-> where cat_id = a.cat_id and price > a.price ) <2
-> order by a.cat_id,a.price desc;
+----------+--------+-------+--------+
| goods_id | cat_id | price | status |
+----------+--------+-------+--------+
| 2 | 101 | 99 | 1 |
| 17 | 101 | 94 | 0 |
| 18 | 102 | 99 | 1 |
| 3 | 102 | 98 | 0 |
| 8 | 103 | 99 | 1 |
| 9 | 103 | 98 | 1 |
| 11 | 104 | 96 | 1 |
| 12 | 104 | 95 | 1 |
| 21 | 105 | 99 | 1 |
| 20 | 105 | 89 | 0 |
+----------+--------+-------+--------+
10 rows in set (0.00 sec)
2. 每个分类找出价格最高的有效的两个商品(正确)
mysql> select a.*
-> from mygoods a
-> where (select count(*) from mygoods
-> where cat_id = a.cat_id and price > a.price and status=1 ) <2
-> and status=1
-> order by a.cat_id,a.price desc ;
+----------+--------+-------+--------+
| goods_id | cat_id | price | status |
+----------+--------+-------+--------+
| 2 | 101 | 99 | 1 |
| 16 | 101 | 93 | 1 |
| 18 | 102 | 99 | 1 |
| 6 | 102 | 94 | 1 |
| 8 | 103 | 99 | 1 |
| 9 | 103 | 98 | 1 |
| 11 | 104 | 96 | 1 |
| 12 | 104 | 95 | 1 |
| 21 | 105 | 99 | 1 |
| 19 | 105 | 85 | 1 |
+----------+--------+-------+--------+
10 rows in set (0.00 sec)
mysql> select a.*
-> from mygoods a
-> left join mygoods b
-> on a.cat_id = b.cat_id and a.price < b.price and b.status=1
-> where a.status=1
-> group by a.goods_id,a.cat_id,a.price
-> having count(b.goods_id) < 2
-> order by a.cat_id,a.price desc;
+----------+--------+-------+--------+
| goods_id | cat_id | price | status |
+----------+--------+-------+--------+
| 2 | 101 | 99 | 1 |
| 16 | 101 | 93 | 1 |
| 18 | 102 | 99 | 1 |
| 6 | 102 | 94 | 1 |
| 8 | 103 | 99 | 1 |
| 9 | 103 | 98 | 1 |
| 11 | 104 | 96 | 1 |
| 12 | 104 | 95 | 1 |
| 21 | 105 | 99 | 1 |
| 19 | 105 | 85 | 1 |
+----------+--------+-------+--------+
10 rows in set (0.00 sec)
mysql> select a.*
-> from mygoods a
-> where (select count(*) from mygoods
-> where cat_id = a.cat_id and price > a.price ) <2 and status=1
-> order by a.cat_id,a.price desc;
+----------+--------+-------+--------+
| goods_id | cat_id | price | status |
+----------+--------+-------+--------+
| 2 | 101 | 99 | 1 |
| 18 | 102 | 99 | 1 |
| 8 | 103 | 99 | 1 |
| 9 | 103 | 98 | 1 |
| 11 | 104 | 96 | 1 |
| 12 | 104 | 95 | 1 |
| 21 | 105 | 99 | 1 |
+----------+--------+-------+--------+
7 rows in set (0.00 sec)
可以将每个分组下的goods_id合并。
mysql> select cat_id,GROUP_CONCAT(goods_id) from mygoods group by cat_id;
+--------+------------------------+
| cat_id | GROUP_CONCAT(goods_id) |
+--------+------------------------+
| 101 | 1,2,15,16,17 |
| 102 | 3,5,6,7,18 |
| 103 | 4,8,9,10 |
| 104 | 11,12,13 |
| 105 | 19,20,21 |
+--------+------------------------+
5 rows in set (0.00 sec)
mysql分组取每组前几条记录(排序)的更多相关文章
- mysql分组取每组前几条记录(排名)
1.创建表 create table tb( name varchar(10), val int, memo varchar(20) ); 2.插入数据 insert into tb values(' ...
- 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 >= ...
随机推荐
- 动态改变UIPopupList选项(NGUI)
NGUI的UIPopupList 可以通过修改items属性来动态改变菜单选项: public class popListvahnge : MonoBehaviour { public UIPopup ...
- HDU4666+POJ2926【最远曼哈顿距离】
一开始就明白那个N*1<k的算法了, 可无奈删除操作耗时还是太多,最后学习了STL set,map相应的用法,方便好多. STL真的是一个好工具 #include<iostream> ...
- Linux 下升级python和安装pip
Linux版本升级: 1. 首先确认Linux操作系统中自带的python 版本时候与自己所需要的版本一致 所有的python版本都在https://www.python.org/ftp/pytho ...
- angular中如何监控dom渲染完毕
刚刚看到群上一个人说,他们公司凡是用angular和jquery插件一起用的人,都被解雇了,没看到这句话之前我很惭愧的说我有这样用过,其实angular的生态系统那么完善,完全可以不用去操作任何的do ...
- SetWindowsHookEx 钩子
基本介绍 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理 ...
- Starting MySQL.. ERROR! The server quit without updating PID file (/gechong/mysqldata/10-9-23-119.pid).
配置文件修改错误了,还原一下重启服务就OK了. # /etc/init.d/mysql start
- js 数组循环删除元素或对象
1.根据不同条件,删除数组中的元素或对象 for(var i=0,flag=true,len=attrList.length;i<len;flag ? i++ : i){ if(attrList ...
- Java之异常机制(1) - 高效处理异常
Java开发人员做出的有关架构的最重要的决定之一便是如何使用Java异常模型.Java异常处理成为社区中讨论最多的话题之一.一些人认为Java语 言中的已检查异常(Checked Exceptions ...
- Android中保存静态秘钥实践(转)
本文我们将讲解一个Android产品研发中可能会碰到的一个问题:如何在App中保存静态秘钥以及保证其安全性.许多的移动app需要在app端保存一些静态字符串常量,其可能是静态秘钥.第三方appId等. ...
- CF MVC3此操作要求连接到 'master' 数据库。无法创建与 'master' 数据库之间的连接,这是因为已打开原始数据库连接,并且已从连接字符串中删除凭据。请提供未打开的连接 解决方法
<add name="ProwebEntities" connectionString ="Data Source=.;Integrated Security=tr ...