Я искал форум, чтобы найти решение для моей проблемы. Моя проблема
в том, что я не могу узнать, как сохранить рейтинговую позицию каждого турнира
это проводится. Я создал две таблицы и запрос, который выглядит следующим образом:
конкуренты (первичный ключ 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), где я вставляю каждую позицию для каждого участника.
Надеюсь, кто-то понимает мою проблему и может дать мне несколько советов или решений этой проблемы
Если мое понимание было правильным, то я надеюсь, что это сработает для вас
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 Вот
Если вы хотите получить результаты по каждому турниру, вы можете сделать это так:
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
И нет, вам не нужна таблица с позициями, потому что это рассчитанные данные. Единственная причина, по которой вы хотите это сделать, — это соображения производительности (и обновлять его автоматически каждый раз).