数据库
首页 > 数据库> > mysql如何通过group by和在左联接中获得第二高的值

mysql如何通过group by和在左联接中获得第二高的值

作者:互联网

(select id from owner where date_format(auction_date,'%Y-%m-%d %H:%i:00') = date_format(NOW(),'%Y-%m-%d %H:%i:00')) as a
    left join (select owner_id,max(nb) as maxbid from auction group by owner_id) as b on a.id=b.owner_id
    left join (select owner_id,max(mb) as maxautobid from auction group by owner_id) as c on a.id=c.owner_id

对于第二个左连接语句,我能够获得最高的mb值.有人可以帮我添加第三个左连接语句,以便获得第二高的mb值吗?

解决方法:

首先,您根本不需要第三次联接.您可以在一个联接中进行计算:

from (select id
      from owner
      where date_format(auction_date,'%Y-%m-%d %H:%i:00') = date_format(NOW(),'%Y-%m-%d %H:%i:00')
     ) as a left join
     (select owner_id, max(nb) as maxbid, max(mb) as maxautobi
      from auction
      group by owner_id
     ) b
     on a.id=b.owner_id;

然后,使用mb来获得mb的第二个最大值,这个技巧涉及substring_index()和group_concat():

   from (select id
          from owner
          where date_format(auction_date,'%Y-%m-%d %H:%i:00') = date_format(NOW(),'%Y-%m-%d %H:%i:00')
         ) as a left join
         (select owner_id, max(nb) as maxbid, max(mb) as maxautobi,
                 substring_index(substring_index(group_concat(mb order by mb desc), ',', 2), ',', -1
                                ) as second_mb
          from auction
          group by owner_id
         ) b
         on a.id=b.owner_id;

想法是将这些值连接在一起,按mb排序.然后使用列表的第二个元素.一个缺点是,即使该值以数字开头,它也会转换为字符串.

标签:greatest-n-per-group,mysql
来源: https://codeday.me/bug/20191123/2064277.html