2014-12-15 19 views
7

Przeszukałem forum, szukając rozwiązania dla mojego problemu. Mój problem: jest to, że nie mogę się dowiedzieć, jak zapisać pozycję w rankingu każdego turnieju , który ma miejsce. Stworzyłem dwie tabele i zapytanie, które wygląda następująco: konkurenci (cid int auto_increment primary key, nazwa varchar (25), nazwisko varchar (25)); comps (compid int auto_increment primary key, tournement int, cid int, points int);Przechowywanie pozycji rangi z mysql

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 

Oto SQLFiddle demo

To, co chcemy osiągnąć jest to, że gdy użytkownik kliknie na konkurenta profil pozycje są pokazane na każdym turnieju jak ten:

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

mam zgrupowane punkty, ale nie mam pojęcia, jak to zrobić z pozycji. Czy jest to możliwe z tego zapytania lub czy muszę utworzyć nową tabelę, taką jak pozycje (pid int auto_increment primary key, turniej int, cid int, position int), w której wstawiam każdą pozycję dla każdego konkurenta.

Mam nadzieję, że ktoś rozumie mój problem i może mi dać jakieś wskazówki lub rozwiązania tego problemu

+0

Czy nie te zamawiać? Pozycja to liczba punktów nr? –

+0

Punkty są uporządkowane poprawnie według group_concat, ale chcę zapisać pozycję w ten sam sposób ze zmiennej @rowno. Mam nadzieję, że to ma sens, więc pozycja i punkty są razem. – Headpetrol

+0

Cóż, przykro mi, ale jeśli pozycja jest podana przez punkty, nie widzę potrzeby dodawania kolejnego pola dla pozycji. Możesz jednak dodać pole o nazwie position, a następnie zrobić to, co chcesz –

Odpowiedz

1

Jeśli moje zrozumienie rację wtedy mam nadzieję, że będzie pracować dla Ciebie

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 

robocza SQL Fiddle Here

+0

to jest to, co próbowałem zrobić. DZIĘKUJĘ CI! – Headpetrol

+0

Próbuję wprowadzić to samo do tabeli ligowej, ale nie mogę tego rozgryźć. Mój stół ligowy jest ustawiony tak [link] (http://sqlfiddle.com/#!2/a6b87/1/0) i chcę uzyskać tę samą pozycję po każdej kolejce. – Headpetrol

0

Jeśli chcesz wyników na turnieju można zrobić to tak:

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

Jeśli chcesz mieć najłatwiej to zgrupowane jest użycie podzapytania podsumować punkty za konkurenta:

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

I nic nie chcesz tabeli z pozycji, ponieważ to obliczone dane. Jedynym powodem, dla którego chcesz to zrobić, jest wydajność (i aktualizuj go automatycznie co X).

Powiązane problemy