2015-06-07 3 views
0

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

Что мне нужно сделать, это выбрать ранг хранилища (где id = x), основанный на значении точек, если хранилище привязано, тогда ранг должен быть одним и тем же (т. Е. Два магазина в первом соединении)

Мне тогда нужно выбрать ранг репутации, основанный на сумме баллов репса.

Магазины

id name points rep_id 
1 Regents Street 1501 3 
2 Oxford Street 1500 2 
3 Carnaby Street 1499 3 
4 Edward Street 1499 1 
5 Edward Street 1499 4 

Репс

id name 
1 John Smith 
2 John Doe 
3 Joe Smit 
3 Lou Jackson 

Магазин Лидеры:

1st - 1, Regents Street 
2nd - 2, Oxford Street 
3rd - 3,4,5 

Rep Лидеры:

1st - 3, Joe Smit (3000) 
2nd - 2, John Doe (1500) 
3rd - 1,4 (1499) 

У меня есть запрос на получение рангов магазина, но он не работает со связями.

SELECT id, 
     name, 
     points, 
     FIND_IN_SET(points, 
        (SELECT GROUP_CONCAT(points 
              ORDER BY points DESC) 
         FROM stores)) AS rank 
FROM stores 
WHERE id = 1 

Благодаря

+0

Пожалуйста, отредактируйте ваш вопрос с данными образца и желаемыми результатами. –

+0

Я добавил желаемый рейтинг на основе данных. – rpiz

ответ

0

Я обычно использую переменные для этого типа ранжирования:

select s.*, 
     (@rn := if(@p = points, @rn, 
        if(@p := points, @rn + 1, @rn + 1) 
       ) 
     ) as rank 
from stores s cross join 
    (select @rn := 0, @p := -1) 
order by s.points desc; 

Другого подходом является коррелированными подзапросами:

select s.*, 
     (select count(distinct s2.points) 
     from stores s2 
     where s2.points >= s.points 
     ) as rank 
from store s; 

Оба эти запросы фактически реализовать dense_rank(), а не rank(). С вашего вопроса непонятно, чего вы на самом деле хотите. И они также могут быть изменены для ранжирования.

EDIT:

Если вам это нужно для повторений, а не магазинов (что, кажется, похоронят рядом с начала этого вопроса):

Я думаю это будет работать в MySQL:

select s.rep_id, 
     (select count(distinct r2.points) 
     from (select s.rep_id, sum(s.points) as points 
       from stores s 
       group by s.rep_id 
      ) r2 
     where r2.points >= r.points 
     ) as rank 
from (select s.rep_id, sum(s.points) as points 
     from stores s 
     group by s.rep_id 
    ) r; 
+0

Второй запрос дает результаты, которые мне нужны, как я могу получить тот же тип результатов на основе SUM каждого балла? – rpiz

Смежные вопросы