mysql如何在组by和左连接中获得第2高的值

时间:2021-07-08 12:14:27
(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

For the second left join statement, i'm able to get the highest mb value. Can someone help me add a third left join statement so that i can get the second highest mb value??

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

1 个解决方案

#1


3  

First, you don't need a third join at all. You can do your calculation in one join:

首先,你根本不需要第三个连接。您可以在一个连接中进行计算:

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;

Getting the second largest value for mb then uses a trick, involving substring_index() and group_concat():

然后使用一个技巧获取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;

The idea is to concatenate the values together, ordering by mb. Then take the second element of the list. The one downside is that the value is converted to a character string, even when it starts as a number.

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

#1


3  

First, you don't need a third join at all. You can do your calculation in one join:

首先,你根本不需要第三个连接。您可以在一个连接中进行计算:

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;

Getting the second largest value for mb then uses a trick, involving substring_index() and group_concat():

然后使用一个技巧获取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;

The idea is to concatenate the values together, ordering by mb. Then take the second element of the list. The one downside is that the value is converted to a character string, even when it starts as a number.

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