2014-12-15 5 views
7

Ich habe das Forum nach der Lösung für mein Problem gesucht. Mein Problem ist, dass ich nicht herausfinden kann, wie man eine Rangliste jedes Turniers speichert, das gehalten wird. Ich habe zwei Tabellen und eine Abfrage erstellt, die wie folgt aussehen: Konkurrenten (cid int auto_increment Primärschlüssel, Name varchar (25), Nachname varchar (25)); comps (compid int auto_increment Primärschlüssel, Turnier int, cid int, Punkte int);Speichern Rangposition von 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 

Hier ist SQLFiddle demo

Das, was ich erreichen möchte, ist, dass, wenn ein Benutzer auf einem Wettbewerber Profil geklickt hat die Positionen für jedes Turnier wie folgt dargestellt:

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

Ich habe gruppierte die Punkte, aber ich habe keine Ahnung, wie man das mit Positionen macht. Ist das möglich von dieser Abfrage oder muss ich eine neue Tabelle wie Positionen erstellen (pid int auto_increment Primärschlüssel, Turnier int, cid int, Position int), wo ich jede Position für jeden Wettbewerber einfügen.

Hoffentlich versteht jemand mein Problem und konnte mir ein paar Tipps oder Lösungen für dieses Problem

+0

bestellt nicht die? Eine Position ist die Menge der Punkte nein? –

+0

Die Punkte werden von group_concat korrekt sortiert, aber ich möchte die Position auf die gleiche Weise von der Variable @rowno speichern. Ich hoffe es macht Sinn, also sind Position und Punkte zusammen. – Headpetrol

+0

Nun, tut mir leid, aber wenn die Position durch Punkte gegeben ist, sehe ich nicht sinnvoll, ein weiteres Feld für die Position hinzuzufügen. Sie können jedoch ein Feld namens position hinzufügen und dann tun, was Sie wollen –

Antwort

1

Wenn mein Verständnis richtig war dann hoffe ich, dies für Sie arbeiten wird

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 

Arbeits Sql Fiddle Here

+0

das ist, was ich versucht habe zu tun. DANKE! – Headpetrol

+0

Ich versuche das gleiche in die Tabelle zu implementieren, aber ich kann es nicht herausfinden. Meine Ligatabelle ist wie folgt aufgebaut [link] (http://sqlfiddle.com/#!2/a6b87/1/0) und ich möchte nach jedem Spieltag dieselbe Position erhalten. – Headpetrol

0

Wenn Sie die Ergebnisse pro Turnier wollen Sie es wie folgt tun:

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

Wenn Sie haben wollen es gruppiert am einfachsten, eine Unterabfrage zu verwenden, ist es, die Punkte pro Wettbewerber zusammenzufassen:

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

Und nicht Sie, nicht über eine Tabelle mit Positionen wollen, weil das ist, berechnet Daten. Der einzige Grund, warum Sie das tun möchten, ist aus Performance-Gründen (und aktualisieren Sie es automatisch jedes Mal).