mysql分组取每组前几条记录_mysql分组取每组前几条记录(排名)

本文介绍了如何在MySQL中按分组取每组的最大或最小值所在的记录,提供了多种方法,包括使用子查询、exists、inner join等。示例涉及根据name字段分组并选取val的最大值和最小值的记录,以及按cat_id分组获取价格最高和最低的商品记录。
摘要由CSDN通过智能技术生成

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分组取每组前几条记录&lpar;排序&rpar;

首先来造一部分数据,表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分组取每组前一&lpar;或几&rpar;条记录&lpar;排名&rpar;

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 >= ...

随机推荐

&lbrack;Tools&rsqb; Vim插件管理

我们在使用插件的时候,都不希望插件安装的很杂乱,它不是一个看不见的黑盒,也为了下次方便在其它地方安装. 由于要方便插件管理,于是有了 Vundle,以下做些介绍: 1. 一个插件管理器, 自己本身也是 ...

careercup-数学与概率 7&period;7

7.7 有些数的素因子只有3.5.7,请设计一个算法,找出其中第k个数. 解法: 首先,我们可以将满足条件的前几个数列出来,以此寻找解题思路. 一种简单的思路就是对于已经列出的数,我们依次去乘以3,5 ...

&lowbar;&lowbar;construct&lpar;&rpar;和&lowbar;&lowbar;initialize&lpar;&rpar;

ThinkPHP中的__initialize()和类的构造函数__construct()网上有很多关于__initialize()的说法和用法,总感觉不对头,所以自己测试了一下.将结果和大家分享.不对 ...

Java学习笔记--Swing2D图形

1.处理2D图形 要想使用java 2D库绘制图形,需要获得一个Graphics2D类对象.这个类是Graphics类的子类.paintComponent方法自动获得一个Graphics2D类对象,我 ...

string&period;Format组合跳转路径

string url = this.ResolveClientUrl("~/page/bn_stu.aspx"); string str = string.Format(&quot ...

Git 如何 clone 非 master 分支的代码

问题描述 我们每次使用命令 git clone git@gitlab.xxx.com:xxxxx.git 默认 clone 的是这个仓库的 master 分支.如果最新的代码不在 master 分支上 ...

Java内存的 静态方法和实例方法的区别及使用场景

注意:变量指基本数据类型非对象,局部变量不能被静态修饰 1.(静态)成员变量存放在data segment区(数据区),字符串常量也存放在该区 2.非静态变量,new出来的对象存放在堆内存,所有局部变 ...

HTTP 协议(一)之基本概念入门

一.网络基础 TCP/IP 计算机与网络设备要相互通信,双方就必须基于相同的方法. TCP/IP 协议族按层次分别分为以下 4层:应用层.传输层.网络层和数据链路层. 应用层: 决定了向用户提供应用服 ...

Oracle 常见字符操作

一.拼接 1.使用 || 来实现 SELECT '你'||'好!' title FROM dual; 2.使用concat (不支持多个字符串的拼接,但是可以嵌套调用) SELECT concat(' ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值