Отображать только лучшие результаты суммирования с помощью - PullRequest
0 голосов
/ 10 мая 2018

Моя таблица записывает три разных результата (сайт, парк, разделение) для одной и той же группы пользователей. Общий балл пользователя - это «сумма всех баллов сайта» + «сумма всех баллов парка» + «сумма всех баллов дивизиона».

Код следующий, и я использую MySQL:

select  sum(points)as points, user_name 
from 
(SELECT sum(site_point) as points, user_name from visits v join users u on 
u.user_id = v.user_id group by user_name
union 
select sum(park_point) as points , user_name  from visits v join users u on                 
u.user_id = v.user_id group by user_name
union
select sum(division_point) as points , user_name  from visits v join users u 
on u.user_id = v.user_id  group by user_name
) V group by user_name  order by sum(points) DESC ;

Я хочу отображать только пользователей, чьи оценки находятся в топ-5, и их оценки. Десять пользователей могут иметь одинаковый наивысший балл. Мне нужно, чтобы все они отображались. Я ценю любую помощь.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Используйте команду LIMIT. Подробнее здесь

Таким образом, добавление его в ваш SQL приведет к:

select  sum(points)as points, user_name 
from 
(SELECT sum(site_point) as points, user_name from visits v join users u on 
u.user_id = v.user_id group by user_name
union 
select sum(park_point) as points , user_name  from visits v join users u on                 
u.user_id = v.user_id group by user_name
union
select sum(division_point) as points , user_name  from visits v join users u 
on u.user_id = v.user_id  group by user_name
) V group by user_name  order by sum(points) DESC LIMIT 5
0 голосов
/ 10 мая 2018

Я думаю, это то, что вы хотите:

select user_name,
       sum(site_point + park_point + division_point) as points
from visits v join
     users u
     on u.user_id = v.user_id
group by user_name
order by points desc
limit 5;

Единая агрегация упрощает расчет.

Вы можете не осознавать этого, но union при некоторых обстоятельствах выдаст неверные результаты. Union удаляет дубликаты, поэтому, если у пользователя одинаковые частичные оценки, две строки становятся одной.

EDIT:

Немного сложнее получить первые 5 баллов , но возможно:

select user_name,
       sum(site_point + park_point + division_point) as points
from visits v join
     users u
     on u.user_id = v.user_id
group by user_name
having points >= (select distinct points
                  from (select sum(site_point + park_point + division_point)
                        from visits v join
                             users u
                             on u.user_id = v.user_id
                        group by user_name
                       ) vu
                  order by points desc
                  limit 1 offset 4
                 )
order by points desc
limit 5;

Предполагая, что user_name является уникальным для данного идентификатора, вы можете упростить это немного:

having points >= (select distinct points
                  from (select sum(site_point + park_point + division_point) as points
                        from visits v 
                        group by user_id
                       ) vu
                  order by points desc
                  limit 1 offset 4
                 )

И, если вы хотите, чтобы кто-то соответствовал топ-5 пользователям - но возвращал более 5 строк при наличии связей - тогда измените select distinct на select в подзапросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...