2 u010587476 u010587476 于 2017.01.09 10:44 提问

sql分组后查询每个分组的最小值的一条记录(mysql)

图片说明
表结构 以及数据如上

期望结果如下:
图片说明
解释:根据gid 进行分组 查询每个gid分组下price最小值的** 一行记录**(即对应pid主键的一整条记录) sql怎么写 (Mysql 数据库!!!)

表语句
CREATE TABLE test (
pid int(10) NOT NULL AUTO_INCREMENT,
gid int(11) NOT NULL,
price decimal(10,3) NOT NULL,
other decimal(10,3) NOT NULL,
PRIMARY KEY (pid)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8

14个回答

engchina
engchina   Rxr 2017.01.09 12:31
已采纳

后来才看见你的建表语句,如果为表名test的话

select s.pid,s.gid,s.price,s.other
from
(select min(price) as min_price,gid from test group by gid) t1,test s
where t1.min_price = s.price
and t1.gid = s.gid;
engchina
engchina 回复engchina: 把表名改为test, select pid,gid,price,other from test where pid in ( select min(s.pid) as min_pid from (select min(price) as min_price,gid from test group by gid) t1,test s where t1.min_price = s.price and t1.gid = s.gid group by s.gid,s.price ) ;
一年多之前 回复
engchina
engchina select pid,gid,price,other from sample where pid in ( select min(s.pid) as min_pid from (select min(price) as min_price,gid from test group by gid) t1,test s where t1.min_price = s.price and t1.gid = s.gid group by s.gid,s.price ) ;
一年多之前 回复
engchina
engchina 回复深蓝色回忆: 假设你取pid最小的那个。
一年多之前 回复
u010587476
u010587476 不能去根据价格去比较吧!如果两个价格相同的话 我只取其中一个
一年多之前 回复
qq_36978352
qq_36978352   2017.01.09 11:04

select * from (
select t.*, row_number() over(partition by gid oredr by price) rnk from t t )
where rnk=1;

u010587476
u010587476 但是使用的是mysql数据库 大神
一年多之前 回复
HGoooonG
HGoooonG   2017.01.09 11:06

select a.* from 表名 as a where price = (select min(price) from 表名 where a.gid=gid)

u010587476
u010587476 根据价格去匹配的话 如果有两条价格一样的呢
一年多之前 回复
u011368649
u011368649   2017.01.09 11:08

这个应该使用子查询吧,我写了一个,你可以试试
SELECT * FROM 表 WHERE price IN(SELECT MIN(price) FROM 表 GROUP BY(gid));

u011368649
u011368649 回复深蓝色回忆: 最后再按照gid聚合一次,不就可以筛选出来了?SELECT * FROM a WHERE price IN(SELECT MIN(price) FROM a GROUP BY(gid)) GROUP BY(gid);
一年多之前 回复
u010587476
u010587476 根据价格去匹配会不精确 如果有多个价格一样的要取出其中一条
一年多之前 回复
Alina6
Alina6   2017.01.09 11:27

图片说明图片说明

qq_14843403
qq_14843403 回复深蓝色回忆: 这两个字段有什么错误 ,我试了下 这样也可以正确查询出来啊,而且pid和other也是对应的值啊
一年多之前 回复
u010587476
u010587476 这样出来的经过会有点错误的,取出了gid分组和最低价 但是pid和other字段会有错误
一年多之前 回复
engchina
engchina   Rxr 2017.01.09 13:25

在这整形回复下,这是用in的写法

select pid,gid,price,other
from test
where pid in
(
select min(s.pid) as min_pid
from
(select min(price) as min_price,gid from test group by gid) t1,test s
where t1.min_price = s.price
and t1.gid = s.gid
group by s.gid,s.price
)

如果用exits写法

select t2.pid,t2.gid,t2.price,t2.other
from test t2
where exists
(
select 1 from
(
select min(s.pid) as min_pid
from
(select min(price) as min_price,gid from test group by gid) t1,test s
where t1.min_price = s.price
and t1.gid = s.gid
group by s.gid,s.price
) t3
where t2.pid = t3.min_pid
)
u010587476
u010587476 谢谢 是可以的! 如何效率更高吧
一年多之前 回复
q1010174887
q1010174887   2017.01.09 10:52

mysql 函数 min 可以试一试?

u010587476
u010587476   2017.01.09 10:58

知道用min啊 最终要的是一整条记录 不是一两个字段

u010587476
u010587476   2017.01.09 11:24

不能根据价格去判断 如果有价格相同呢

qq_36978352
qq_36978352   2017.01.09 11:28

用 row_number() over()排序,把1的选出来就可以了

共14条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
MySql分组后显示指定字段的最大或最小值所在的记录
* 我们有时候会有这种需求: 查询分组后的结果作为子表, 而主表需要子表中每组的某列的最大或最小值. 但是如果在 GROUP BY 后添加 ORDER BY 只是对分组后的数据进行排序, 影响不到分组里面. 针对这种需求我们有两中方法:* 1. 通过 ROLLUP. 2. 通过自连查询. 首先我们新建一些测试数据:---------------------------------------
mysql取出每个分组中最新的记录
mysql取出每个分组中最新的记录
MYSQL group by 分组后只取最大、最小值对应的记录方法
这里有2篇文章 综合起来就差不多了 工作忙 没时间整理 其实和其它数据库一样 并没有什么捷径 效率的话还是join比较快 MYSQL每个用户取1条记录的三种写法(group by xxx) 同学问我关于这方面的SQL语句,我特意记忆一下,毕竟这个也比较常见了 [sql] select * from (select * from member_payment
[MySQL]分组后查找每组的前N条记录语句
分组后查找每组的前N条记录语句    作者:张守磊  Java代码   考你一条sql语句   如有表 student    id  name age  class    1   张1   15     1   2   张2   15     1   3   张3   15     1   4   张4  15     2   5   张5  
sql中查询每组的最后一条数据
学号        分数                     测试时间 1               70              2011-10-21 20:21:32 1              85                2011-12-10 10:19:02 2              49               2012-02-11 13:32:45 2
mysql 取每个分组中时间最近的记录
SELECT * FROM baoma_auction AS a WHERE NOT EXISTS ( SELECT 1 FROM baoma_auction WHERE goods_id = a.goods_id AND a.modify_
如何求某个分组里面的最小时间点对应的那条记录
前段时间遇到一个需求是求一组数据里边,距离某
在mysql中使用group by和order by取每个分组中日期最大一行数据
在mysql中使用group by进行分组后取某一列的最大值,我们可以直接使用MAX()函数来实现,但是如果我们要取最大值对应的ID,那么我们需要取得整行的数据。最开始的实现方法如下SELECT t.event_id,MAX(t.create_time) as create_time from monitor_company_event t GROUP BY t.company_name,t.ro
分组查询最大/最小值sql
经典题目:查询每个班级的最高分,查询每种日志的最晚记录 1.查询每个班级的最高分(不考虑同一分数的) SQL语句: SELECT id,name,calssid,MAX(score) FROM (SELECT * FROM t_zhb ORDER BY score desc) A GROUP BY calssid; 查询结果: 必须要有子查询,子查询先要排序,如果取最大,倒序排,
mysql 分组取最新的一条记录(整条记录)
mysql取分组后最新的一条记录,下面两种方法.一种是先筛选 出最大和最新的时间,在连表查询.一种是先排序,然后在次分组查询(默认第一条),就是最新的一条数据了#select * from t_assistant_article as a, (select max(base_id) as base_id, max(create_time) as create_time from t_assista