A ideia é usar uma subconsulta para calcular a soma, depois fazer o cálculo e colocar os valores em uma única coluna delimitada por vírgula, que você pode transformar em um array em 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;
EDITAR:
As tabelas em SQL são inerentemente desordenadas e a classificação em SQL não é estável (o que significa que a ordem original não é preservada). Você pode especificar uma ordenação no
group_concat()
declaração. Por exemplo, o seguinte ordenaria os resultados por 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;
E isso seria ordenado pela classificação mais alta primeiro:
select v.ip, group_concat(v.visits / iv.maxvisits order by v.visits desc) as ratings
Você pode tornar a lista mais complexa para incluir o
id
nele também:select v.ip,
group_concat(concat(v.id, ':', v.visits / iv.maxvisits)) as ratings