sql >> Database teknologi >  >> RDS >> Mysql

Kompleks SQL SELECT for at beregne vurdering på en enkelt kolonne

Ideen er at bruge en underforespørgsel til at beregne summen, derefter lave beregningen og sætte værdierne i en enkelt kommasepareret kolonne, som du kan transformere til en matrix i 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;

EDIT:

Tabeller i SQL er i sagens natur uordnet, og sortering i SQL er ikke stabil (hvilket betyder, at den oprindelige rækkefølge ikke er bevaret). Du kan angive en rækkefølge i group_concat() udmelding. For eksempel vil følgende sortere resultaterne efter 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;

Og dette ville sortere efter den højeste vurdering først:

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

Du kan gøre listen mere kompleks for at inkludere id også i den:

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



  1. Ret "SQL-server blokerede adgang til ERKLÆRING 'OpenRowset/OpenDatasource' for komponenten 'Ad Hoc Distributed Queries'

  2. Yii2 Hvordan udføres hvor OG eller ELLER tilstandsgruppering?

  3. laravel databaseforbindelse returnerer udefineret indeksfejl

  4. hvordan man opretter trigger til at lave sammenkædning af felter