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 ) ;
11 个月之前 回复
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 ) ;
11 个月之前 回复
engchina
engchina 回复深蓝色回忆: 假设你取pid最小的那个。
11 个月之前 回复
u010587476
u010587476 不能去根据价格去比较吧!如果两个价格相同的话 我只取其中一个
11 个月之前 回复
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数据库 大神
11 个月之前 回复
HGoooonG
HGoooonG   2017.01.09 11:06

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

u010587476
u010587476 根据价格去匹配的话 如果有两条价格一样的呢
11 个月之前 回复
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);
11 个月之前 回复
u010587476
u010587476 根据价格去匹配会不精确 如果有多个价格一样的要取出其中一条
11 个月之前 回复
Alina6
Alina6   2017.01.09 11:27

图片说明图片说明

qq_14843403
qq_14843403 回复深蓝色回忆: 这两个字段有什么错误 ,我试了下 这样也可以正确查询出来啊,而且pid和other也是对应的值啊
11 个月之前 回复
u010587476
u010587476 这样出来的经过会有点错误的,取出了gid分组和最低价 但是pid和other字段会有错误
11 个月之前 回复
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 谢谢 是可以的! 如何效率更高吧
11 个月之前 回复
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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!