Создание рейтинга

Тема в разделе "PHP", создана пользователем Ad1ce, 16 дек 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Ad1ce

    Ad1ce Постоялец

    Регистр.:
    18 авг 2009
    Сообщения:
    109
    Симпатии:
    25
    Предположим есть таблица с людьми, их описаниями, есть вторая таблица с двумя полями - id чувака и его рейтинг.
    Как сделать так, чтобы при просмотре информации об чуваке показывалось, типа рейтинг 56 из 1435?
    Я вижу тут только одно решение: создать еще одно поле в таблице рейтинга указывающее на текущее положение в рейтинге. Однако эта информация будет со временем устаревать, и придется делать очень часто перерасчет позиции в рейтинге. Есть ли более легкие решения? Можно ли сделать без создания еще одного поля, может через базу данных можно вычислить позицию в рейтинге?
     
  2. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    Код:
    SELECT COUNT(*)+1 FROM rating_table WHERE rating>=(SELECT rating FROM rating_table WHERE id=12345 LIMIT 1) AND id<12345
    -- позиция человека в рейтинге
    -- AND id=12345 в конце нужно, чтобы для людей с одинаковым рейтингом не показывало одну и ту же позицию
    -- в таком виде каждый пользователь четко получит свое уникальное место
    SELECT COUNT(*) FROM rating_table
    -- всего позиций
    
    десу
     
    Ad1ce нравится это.
  3. Ad1ce

    Ad1ce Постоялец

    Регистр.:
    18 авг 2009
    Сообщения:
    109
    Симпатии:
    25
    Работает, но только без последней части:AND id<12345.
    С ней выдаются неожиданные результаты. Например при id=1737 выдает 1545, хотя на самом деле 3940.
    Если же id=11, то выдает 2, хотя на самом деле -437 место
     
  4. Alternator

    Alternator

    Регистр.:
    23 мар 2009
    Сообщения:
    295
    Симпатии:
    145
    хм.затупил слегка
    поправил. так вроде адекватно, как я описал должно работать
    Код:
    SELECT COUNT(*)+1 FROM rating_table WHERE
    	rating>(SELECT rating FROM rating_table WHERE id=12345 LIMIT 1) OR 
    	(rating=(SELECT rating FROM rating_table WHERE id=12345 LIMIT 1) AND id<12345)
    
     
    Ad1ce нравится это.
  5. Ad1ce

    Ad1ce Постоялец

    Регистр.:
    18 авг 2009
    Сообщения:
    109
    Симпатии:
    25
    При 4000 записей выполняется за 0,017, хотя мне всегда казалось что count + where+подзапросы долго исполняется, оказывается не так.
    Простой, но изящный и полезный запрос.
     
Статус темы:
Закрыта.