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