u010587476
半吊子攻城狮
采纳率50%
2017-01-09 02:44 阅读 11.7k

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

13条回答 默认 最新

  • 已采纳
    engchina engchina 2017-01-09 04: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;
    
    点赞 评论 复制链接分享
  • qq_36978352 qq_36978352 2017-01-09 03:04

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

    点赞 1 评论 复制链接分享
  • engchina engchina 2017-01-09 05: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
    )
    
    点赞 1 评论 复制链接分享
  • q1010174887 q1010174887 2017-01-09 02:52

    mysql 函数 min 可以试一试?

    点赞 评论 复制链接分享
  • u010587476 半吊子攻城狮 2017-01-09 02:58

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

    点赞 评论 复制链接分享
  • HGoooonG HGoooonG 2017-01-09 03:06

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

    点赞 评论 复制链接分享
  • u011368649 行走于消逝中 2017-01-09 03:08

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

    点赞 评论 复制链接分享
  • u010587476 半吊子攻城狮 2017-01-09 03:24

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

    点赞 评论 复制链接分享
  • Alina6 Alina6 2017-01-09 03:27

    图片说明图片说明

    点赞 评论 复制链接分享
  • qq_36978352 qq_36978352 2017-01-09 03:28

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

    点赞 评论 复制链接分享
  • u010587476 半吊子攻城狮 2017-01-09 03:41

    用的是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

    点赞 评论 复制链接分享
  • engchina engchina 2017-01-09 04:27

    假设你的表明为 sample

    select s.pid,s.gid,s.price,s.other
    from
    (select min(price) as min_price,gid from sample group by gid) t1,sample s
    where t1.min_price = s.price
    and t1.gid = s.gid
    
    点赞 评论 复制链接分享
  • Alina6 Alina6 2017-01-09 06:20

    图片说明

    点赞 评论 复制链接分享

相关推荐