Сохранение ранга от MySQL

Я искал форум, чтобы найти решение для моей проблемы. Моя проблема
в том, что я не могу узнать, как сохранить рейтинговую позицию каждого турнира
это проводится. Я создал две таблицы и запрос, который выглядит следующим образом:
конкуренты (первичный ключ cid int auto_increment, имя varchar (25), фамилия varchar (25));
comps (первичный ключ compid int auto_increment, int tournement, cid int, points int);

   select @rowno:= @rowno+1 as position,  rank.*
from (
select name,lastname,SUM(points) as pts,group_concat(points) as round FROM
(select cid,tournament,points from comps
group by cid,tournament  order by points)total
join competitors c on c.cid = total.cid
cross join   (select @rowno := 0) r
group by total.cid
order by pts desc) rank
order by pts desc

Вот SQLFiddle demo

Я хочу добиться того, чтобы, когда пользователь нажал на профиль участника, позиции показываются для каждого турнира следующим образом:

Name: Competitor One
Tournament 1: 1st 100  pts
Tournament 2: 2nd  80  pts
Tournament 3: 10th 30  pts

Я сгруппировал баллы, но понятия не имею, как это сделать с позициями. Возможно ли это из этого запроса, или мне нужно создать новую таблицу, такую ​​как позиции (первичный ключ pid int auto_increment, турнир int, cid int, позиция int), где я вставляю каждую позицию для каждого участника.

Надеюсь, кто-то понимает мою проблему и может дать мне несколько советов или решений этой проблемы

7

Решение

Если мое понимание было правильным, то я надеюсь, что это сработает для вас

select *,(SELECT COUNT(*)
FROM comps AS cmp2
WHERE cmp1.points < cmp2.points AND cmp1.tournament = cmp2.tournament) + 1  AS position
from competitors AS c1
inner join comps AS cmp1 on c1.cid = cmp1.cid
order by  c1.name,c1.lastname,cmp1.compid, position ASC

Рабочая Sql Fiddle Вот

1

Другие решения

Если вы хотите получить результаты по каждому турниру, вы можете сделать это так:

select * from competitors
inner join comps on competitors.cid = comps.cid
order by tournament, points desc

Если вы хотите сгруппировать его проще всего, используйте подзапрос для суммирования баллов за конкурента:

select *,(select sum(points) from comps where competitors.cid=comps.cid) as points
from competitors
order by points desc

И нет, вам не нужна таблица с позициями, потому что это рассчитанные данные. Единственная причина, по которой вы хотите это сделать, — это соображения производительности (и обновлять его автоматически каждый раз).

0

По вопросам рекламы [email protected]