2009-08-18 33 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; 

投票列表示項目已收到的投票數和評分列代表項目的總評分。現在

,我想要做的就是從表中選擇一個項目根據ID,是這樣的:

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

但是,除此之外,我想計算該行的基礎上的位置評級列和獲取,作爲一個額外的列,讓我們說一個site_rank(所以行的評級越大,它的site_rank會更高,我希望我解釋得很好)。我的猜測是這可以通過一個子查詢來實現,但我不知道如何去做。

任何幫助?

+0

可能我建議實施一個Site_Rank列,每隔一段時間更新一次?可能會容易得多。 – 2009-08-18 16:42:02

+0

這樣你就可以做一個非常大的數據庫調用(或者幾個更小的調用),然後更新每個調用。然後你不需要做5分鐘的其他事情。 – 2009-08-18 16:43:24

回答

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

MySQL支持標準的SQL rank()函數嗎?它確實是你想要的。

select 
    *, 
    rank() over (
    order by rating desc 
) as site_rank 
from media