2009-08-18 25 views
0

のは、私は(これは単なる簡単な例ですが、私が話している実際のテーブルにははるかに複雑である)このようなテーブルがあるとしましょう:投票テーブル内の行の位置を計算

CREATE TABLE media (
id INT NOT NULL AUTO_INCREMENT, 
title VARCHAR(255) NOT NULL, 
description TEXT NOT NULL, 
voted INT NOT NULL DEFAULT 0, 
rating FLOAT NOT NULL DEFAULT 0 
) ENGINE = INNODB; 

カラムはアイテムが受け取った投票の数を表し、の評価はカラムはアイテムの合計評価を表します。

SELECT m.* FROM media AS m WHERE id = 5; 

しかし、加えて、私はに基づいて、この行の位置を計算したい:私がやりたいことは、IDに基づいて、テーブルから単一の項目を選択するようなものである今

定価の列に追加して、それを追加の列として呼び出すと、site_rankが呼び出されるとします(行の評価が高いほどsite_rankは高くなります)。私の推測では、これはsubselectクエリで達成できるが、私はそれを行う方法がわからない。

助けが必要ですか?

+0

頻繁に更新されるSite_Rank列を実装することをおすすめしますか?おそらくもっと簡単だろう。 –

+0

あなたは1つの非常に大きなデータベース呼び出し(またはより小さなもの)を行い、それぞれを更新します。そして、5分ほど何もする必要はありません。 –

答えて

2
SELECT count(*) FROM media WHERE rating > (SELECT rating FROM media WHERE id = 5); 
2

これは、ほとんどの投票メディアに高いrankを出力します。

最も投票された人のランクを下げたい場合(最も投票された人はrank1)、サブクエリの記号を逆にするだけです。

SELECT mo.*, 
     (
     SELECT COUNT(*) 
     FROM media mi 
     WHERE (mi.rating, mi.id) <= (mo.rating, mo.id) 
     ) AS rank 
FROM media mo 
WHERE mo.id = 5 
1
SELECT 
    m1.*, 
    (SELECT COUNT(*) FROM media AS m2 WHERE m2.rating > m1.rating) AS site_rank 
FROM 
    media AS m1 
WHERE 
    id = 5; 

が同じ評価を持つアイテムかもしれないと、彼らは同じサイトのランクを報告しますので、これは完全な順序付けを定義していないことに注意してください。

1

標準のSQLランク()関数をサポートしていますか?それはまさにあなたが望むものです。

select 
    *, 
    rank() over (
    order by rating desc 
) as site_rank 
from media 
関連する問題