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

SQL SELECT complexe pour calculer la note sur une seule colonne

L'idée est d'utiliser une sous-requête pour calculer la somme, puis de faire le calcul et de mettre les valeurs dans une seule colonne délimitée par des virgules, que vous pouvez transformer en tableau en php :

select v.ip, group_concat(v.visits / iv.maxvisits) as ratings
from visit v join
     (SELECT ip, id, visits, max(visits) as maxvisits
      FROM visit
      GROUP BY ip
     ) iv
     on v.ip = iv.ip
group by v.ip;

MODIFIER :

Les tables en SQL sont intrinsèquement non ordonnées et le tri en SQL n'est pas stable (ce qui signifie que l'ordre d'origine n'est pas conservé). Vous pouvez spécifier un ordre dans le group_concat() déclaration. Par exemple, ce qui suit ordonnerait les résultats par id :

select v.ip, group_concat(v.visits / iv.maxvisits order by id) as ratings
from visit v join
     (SELECT ip, id, visits, max(visits) as maxvisits
      FROM visit
      GROUP BY ip
     ) iv
     on v.ip = iv.ip
group by v.ip;

Et cela serait classé par la note la plus élevée en premier :

select v.ip, group_concat(v.visits / iv.maxvisits order by v.visits desc) as ratings

Vous pouvez rendre la liste plus complexe pour inclure le id dedans aussi :

select v.ip,
      group_concat(concat(v.id, ':', v.visits / iv.maxvisits)) as ratings