Pozisyon değişiklikleri sorgulamak için en iyi yolu nedir?

1 Cevap php

Ben göstermek istiyorum sonuçlarının bir tablo var:

| change | position | name | score |
|----------------------------------|
|    -   |     1    | Bob  |  10   |
|   +1   |     2    | Tom  |   8   |
|   -1   |     3    | Sam  |   7   |
|----------------------------------|

Değişiklik sütun Yukarıdaki örnekte, son oyun bu yana Tom Sam geçildi So so -1 vb olduğu 2 3 dan +1 olup, hareketli ve 3 için 2 hareket, kişinin pozisyon hareketini yansıtır.

Can I write a single SQL statement that provides the results including the 'change' column?

Şu anda bunu yapmak için iki sorgu yazıyorum. Ben son oyun hariç puanları almak, sonra en son oyunu da dahil olmak puanları almak ve ben tablo çizmek zaman karşılaştırın.

Örnek:

Previous game results:

SELECT p.name, p.id, SUM(g.points) AS score
FROM players p INNER JOIN games g ON p.id=g.player_id
WHERE g.id<5
ORDER BY score DESC

Daha sonra bir dizisinde bu saklama:

$i=1;
while($row = mysql_fetch_assoc($results){
    $prevPositions[$row['id']] = $i++;
    //render row
}

All game results:

SELECT p.name, SUM(g.points) AS score
FROM players p INNER JOIN games g ON p.id=g.player_id
ORDER BY score DESC

Tablosunu işlerken Ve sonra fark çalışma dışarı:

$i=1;
while($row = mysql_fetch_assoc($results){
    $change = $prevPositions[$row['id']] - $i++;
    //render row
}

Bu çalışıyor - ama sadece iki yerine bir deyim kullanmak eğer kendimi daha iyi hissederdim.

1 Cevap

Bunu dene:

SELECT (S0.Rank - S1.Rank) As Change, S1.Rank As Position, S1.name, S1.score
FROM (SELECT p.name, p.id, SUM(g.points) AS score, @rank1:=@rank1+1 As rank
        FROM (SELECT @rank1:=0) r, players p
      INNER JOIN games g ON p.id=g.player_id
      ORDER BY score DESC) S1
JOIN
     (SELECT p.id, SUM(g.points) AS score, @rank2:=@rank2+1 As rank
        FROM (SELECT @rank2:=0) r, players p
      INNER JOIN games g ON p.id=g.player_id
      WHERE g.id<5
      ORDER BY score DESC) S0
ON S0.id = s1.id

(Ben test değil!)