Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQL SELECT complexo para calcular a classificação em uma única coluna


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