Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql comment obtenir la 2ème valeur la plus élevée avec group by et in a left join

Tout d'abord, vous n'avez pas du tout besoin d'une troisième jointure. Vous pouvez effectuer votre calcul en une seule jointure :

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;

Obtention de la deuxième plus grande valeur pour mb utilise ensuite une astuce, impliquant substring_index() et 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;

L'idée est de concaténer les valeurs ensemble, en les classant par mb . Prenez ensuite le deuxième élément de la liste. Le seul inconvénient est que la valeur est convertie en une chaîne de caractères, même lorsqu'elle commence par un nombre.