2009-08-18 2 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 Column을 구현하는 것이 좋습니다. 아마도 훨씬 쉬울 것입니다. –

+0

그런 식으로 하나의 큰 데이터베이스 호출 (또는 더 작은 데이터베이스 호출)을 수행 한 다음 각각을 업데이트하십시오. 그리고 나서 5 분 동안 다른 것을 할 필요가 없습니다. –

답변

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

대부분의 투표 용지에 대해 높음 rank을 출력합니다.

가장 많이 투표 한 사람 (예 : rank : 1)에 대해 낮은 순위를 원하면 하위 쿼리의 부호 만 바꾸면됩니다. 이 동일한 등급의 아이템 수 있습니다 그들은 같은 사이트 순위를보고 있기 때문에이 완전한 순서를 정의하지 않습니다

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