2014-12-15 13 views
7

Ho cercato nel forum per trovare la soluzione per il mio problema. Il mio problema è che non riesco a scoprire come salvare una posizione in classifica di ogni torneo che si svolge. Ho creato due tabelle e una query simile a questa: concorrenti (cid int auto_increment chiave primaria, nome varchar (25), lastname varchar (25)); comps (compid int auto_increment chiave primaria, tournement int, cid int, punti int);Memorizzazione della posizione di rango da 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 

Ecco SQLFiddle demo

La cosa che voglio ottenere è che quando un utente ha fatto clic su un concorrente profilo le posizioni sono indicati per ogni torneo come questo:

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

ho raggruppato i punti ma non ho idea di come farlo con le posizioni. E 'possibile da questa query o devo creare una nuova tabella come posizioni (pid int auto_increment chiave primaria, torneo int, cid int, posizione int) dove inserisco ogni posizione per ogni concorrente.

Speriamo che qualcuno capisce il mio problema e mi potrebbe dare alcuni suggerimenti o soluzioni a questo problema

+0

non sono quelli ordinati? Una posizione è la quantità di punti no? –

+0

I punti sono ordinati correttamente da group_concat, ma voglio memorizzare la posizione allo stesso modo dalla variabile @rowno. Spero che abbia senso che posizione e punti siano insieme. – Headpetrol

+0

Bene, scusa, ma se la posizione è data da punti, non vedo utile aggiungere un altro campo per la posizione. Comunque puoi aggiungere un campo chiamato position e poi fare ciò che vuoi –

risposta

1

Se la mia comprensione era giusto allora spero che questo funzionerà per voi

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 

lavoro Sql Fiddle Here

+0

questo è quello che stavo cercando di fare. GRAZIE! – Headpetrol

+0

Sto cercando di implementare la stessa cosa in classifica, ma non riesco a capirlo. La mia classifica è impostata in questo modo [collegamento] (http://sqlfiddle.com/#!2/a6b87/1/0) e voglio ottenere la stessa cosa dopo ogni giornata di gioco. – Headpetrol

0

Se si desidera che i risultati per torneo è possibile fare in questo modo:

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

Se si desidera avere è raggruppato più semplice è quello di utilizzare una sottoquery per riassumere i punti per concorrente:

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

E no non si vuole un tavolo con le posizioni, perché questo è calcolato dati. L'unica ragione per cui vorresti farlo è per motivi di prestazioni (e aggiornalo automaticamente ogni volta x).

Problemi correlati