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

Но, кроме того, я хочу, чтобы вычислить положение этой строки на основе рейтинг и выберите это как дополнительный столбец, скажем, имя site_rank (поэтому чем выше рейтинг строки, тем выше будет его site_rank, я надеюсь, что я объяснил это хорошо). Я предполагаю, что это может быть достигнуто с помощью подзапроса, но я не уверен, как это сделать.

Любая помощь?

+0

Могу ли я предложить внедрить столбец Site_Rank, который обновляется каждый так часто? Наверное, было бы намного проще. –

+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 
Смежные вопросы