2012-01-15 2 views
2

ユーザーが投票できる項目の表があります。この表には、アイテムが累積した投票数を保持するvotes列と、それが持っている投票数に基づいてすべての項目のランキングであるrank列があります(つまり、ほとんどの投票ではランク1、ほとんどがランク2になるなど)各項目が投票された後にランクを再計算する

現在、私はすべての投票の後にすべての項目のランクを再計算しています。

SET @rank = 0 
UPDATE items SET rank = @rank := @rank + 1 ORDER BY votes DESC 

これは、ほとんどの部分は動作しますが、議決権をアカウントに取ることはありません:ユーザーの投票が、私は次のクエリですべてのランクを、その項目のvotes列に1を追加し、更新する場合には、ありますネクタイ。投票がある場合[10、4、3、0]、私はランク[1, 2, 3, 4]を期待するでしょう。しかし、もし私が投票[10, 10, 3, 0]を持っていれば、私はランク[1, 1, 3, 4]を希望します。これは起こりません。私はまだランク[1, 2, 3, 4]を取得します。

上記のようにネクタイを組み込むにはどうすればよいですか?

答えて

0

この無粋ソリューションは、あなたが望むものを返します:でこれを試して

update ITEMS I1 
    set rank = 
     (select count(*) 
      from ITEMS I2 
      where I2.VOTES >= I1.VOTES) 
     - (select count(*) - 1 
       from ITEMS I3 
      where I3.VOTES = I1.VOTES) 
+0

これは素晴らしいですが、データベースのランクデータを更新していないように見えます。各行の新しいランクのみを返します。 – drusepth

+0

私は自分の選択を更新に変更して回答を編集しました。 –

1

私はデータベースにランクを保存しません。結果を表示しながら計算することができます。

$rank = 1; 
$lastVotes = -1; 
$lastAdd = 0; 

$query = mysql_query("SELECT * FROM table WHERE * ORDER BY votes DESC", $link); 
while($row = mysql_fetch_array($query)) { 
    // local variable with votes 
    $votes = $row['votes']; 

    // check if we have a tie 
    if($lastVotes == $votes) { 
    // don't change rank if there is a tie but inc $lastAdd 
    $lastAdd += 1; 
    } else { 
    // there is no tie: save last votes, adjust $rank and reset $lastAdd 
    $lastVotes = $votes; 
    $rank += $lastAdd; 
    $lastAdd = 1; 
    } 

    // $rank is your rank 
} 
+1

+1 "私はデータベースのランクを保存しません"。集計値または計算値を別の列に保存すると、同期が外れる機会があふれます。しかし、それのためのケースがあり、それらは通常パフォーマンスに関するものです。そのような場合には、トリガーおよび/または別個のテーブルが適切であり得る。このようなパフォーマンス上の問題には、使用状況の分析が必要です。 –

0

ませんmysqlのインスタンスを、どのようにこのようなものについて:個別のうち

SELECT v.id, v.votes, r.rank 
     FROM votes v 
      ,(SELECT votes, @rownum = @rownum + 1 AS rank 
       FROM votes 
       GROUP BY votes 
       ORDER BY votes DESC 
      ) r 
     WHERE v.votes = r.votes 
     ORDER BY rank 

図"票"のセットを注文し、それぞれに番号を付け、それを使ってその番号(ランク)を各投票に戻します。

+0

ああ、私はそのランクが計算された値だと付け加えるべきです。 – Glenn

関連する問題