Как сделать рейтинг в access

Обновлено: 08.07.2024

Вот озадачился сделать адекватную таблицу рейтинга.
Задача такая - в базе есть десятки тысяч игроков, у каждого есть некий рейтинг. Хочу чтобы при нажатии на "показать рейтинг" игроку выдавалась
страничка с БЛИЖАЙШИМИ к нему рейтингами и место, которое он занимает в таблице.

Т.е. проблема в том, чтобы получить порядковое место игрока.

выбрать всех по рейтингу:
select uname,rating from users order by rating desc - мы получаем всех игроков, отсортированных по местам (непонятно опять таки как выбрать еще и номер места тут)

select uname,rating from users order by rating desc limit 20 - тоже самое, но только первая "страничка" игкроков, т.е. ТОП-20 по рейтингу.

А если у меня место 2340 ? как выбрать нужную страничку на которой я нахожусь чтобы показать, к примеру, 9 сверху меня и 10 снизу? Точнее, как определить что у меня место 2340, если всё, что у меня есть - это рейтинг - некое число..


Может кто делал, подскажите плз..
ЗЫ база MySql но желательна также совместимость с postgre sql

выбери сначала рейтинг самого игрока а потом сделай два запроса что бы определить десятку выше него и десятку ниже его
select uname, rating from users where rating > :user_rating order by rating asc limit 10
select uname, rating from users where rating 18:35, 14 апр 2010

Прикольный синтаксис у SQL. =) Прямо-таки предложения.

Хм.. У меня рейтинг считается вложеной процедурой MySql раз в час, а нельзя ли прямо в ней расставить места каким либо образом? Некий единый апдейт который в зависимости от условий проапдейтит места в таблице юзеров сразу? Так сказать для ускорения доступа к статистике, ибо я посчитал - получается для вызова статистики 6 запросов.. При 3.5 тысячи онлайн это очень дорого.. И так база кочегарит страшно, по 50-60 запросов в секунду.

update users set position=НОМЕР СТРОКИ order by rating desc

Чтобы потом не парится, а сделать
select position, name from users where position>=UPOS-10 and position 12:06, 15 апр 2010

Wo2lf
> Хм.. У меня рейтинг считается вложеной процедурой MySql раз в час, а нельзя ли
> прямо в ней расставить места каким либо образом? Некий единый апдейт который в
> зависимости от условий проапдейтит места в таблице юзеров сразу? Так сказать
> для ускорения доступа к статистике, ибо я посчитал - получается для вызова
> статистики 6 запросов.. При 3.5 тысячи онлайн это очень дорого.. И так база
> кочегарит страшно, по 50-60 запросов в секунду.

да сделать препроцесс позиции в рейтинге конечно лучше будет. Раз в час это даже не особо важно как делать, по производительности это не ударит. Что касается конкретно запроса то там скорее всего удастся решить вложенным запросом, почитай про них в доках.

Ну сделал, вроде работает ) Только сама процедура подсчёта рейтинга и позиции игрока тарабанит минут 15.. Но учитывая, что она на отдельном треде и отдельном коннешне (юзаю пулл коннектов) это не так страшно )

Wo2lf
> select uname,rating from users order by rating desc limit 20 - тоже самое, но
> только первая "страничка" игкроков, т.е. ТОП-20 по рейтингу.
>
> А если у меня место 2340 ? как выбрать нужную страничку на которой я нахожусь
> чтобы показать, к примеру, 9 сверху меня и 10 снизу?
limit 20,100 или limit 100,20 точно не помню как. это в MySQL (незнаю стандарт или нет, хотя всеравно проверь в посгре. стандарты в sql не многие соблюдают)

Wo2lf
> Ну сделал, вроде работает ) Только сама процедура подсчёта рейтинга и позиции
> игрока тарабанит минут 15..
фигово. 15 минут считать рейтинг - очень долго. т.е. обновлять его раз в 15 минут - уже дорого.
как считается рейтинг? если это просто формула (т.е. сначала получаем некотрую оценочную цифру, а потом по ней выставляем места.) то эту цифекрку можно просто хранить в БД и по ней сортировать. т.е. изменились исходные данные - пересчитали цифру и заапдейтили табличку. (на этом поле, разумеется, должен быть индекс создан). дальше уже проще - можно тупо сделать запрос с упорядочиванием по этому столбцу и проабдейтить каждую запись с нужным индексом, но вполне возможно, что в SQL есть какая-нибудь процедурка, которая возвращает индекс в выборке. вконце концов можно и при выводе уже проиндексировать - например выводим 20 записей с нужной страницы (лимитом) и потом их номеруем (зная номер страницы - не сложно понять с какого индекса нумеровать), но тут проблема - нельзя узнать на какой странице находиться нужный пользователь.
еслиже алгоритм рассчета рейтинга завязан на сравнивании параметров игроков (т.е. сложность порядка O(n*n) ) , то ИМХО надо любыми правдами и неправдами отказываться от этого алгоритма (вполне возможно что его можно легко привести к вышеуказанной форме с простой формулой0

В том то и дело что пересчитать 150 тысяч игроков не фунт изюму съесть.

Wo2lf
> В том то и дело что пересчитать 150 тысяч игроков не фунт изюму съесть.
дык что я тебе пишуто - не надо пересчитывать! утебя же не 150к онлайн? изменились данные у одного игрока - изменил одну запись. а рейтинг - просто вывод с сортировкой. чем не подходит?

Kloun
> а рейтинг - просто вывод с сортировкой. чем не подходит?
Наверное тем, что сортировать нужно не только тех, кто в онлайне. А все 150к. Смысл рейтинга, если в нем нет тех, что сейчас не онлайн?

Шьерт, читать надо.
Ну, все-равно, изменения данных многих игроков приводит к изменению всего рейтинга слабо предсказуемым образом. А сортировать после каждого изменения глупо. Так или иначе, либо обновлять индексы для таблицы всех игроков (чтобы прочитать потом только нужные), либо читать всё и сортировать.

RPGman
> аверное тем, что сортировать нужно не только тех, кто в онлайне. А все 150к.
а кто сказал что рейтинг только среди тех кто онлайн? сортирвка по индексированному полю - можно сказать бесплатная вещь ;)

RPGman
> А сортировать после каждого изменения глупо.
сортировка при выборке. select . orger by field

RPGman
> Так или иначе, либо обновлять индексы для таблицы всех игроков
индексы БД сама обновляет. и это гораздо дешевле, чем пересчитывать всех игроков

RPGman
> либо читать всё и сортировать.
ну какбы БД сама сортирует. и скорей вего лучше, чем это можно сделать за примелемое время без использования СУБД

Kloun
> сортирвка по индексированному полю - можно сказать бесплатная вещь ;)
Это при выборке. А обновление индекса? Которое нифига не дешевое, и будет после каждого коммита?
Никогда не сравнивал скорость заливания мапы (сортированное множество), и заливание вектора с последующей однократной сортировкой?

RPGman
> Которое нифига не дешевое, и будет после каждого коммита?
изменение индекса из за одного элемета куда дешевле, что на изменение 150ти тыс. записей.
даже если 150тыс мы апдейтим не затрагивая индексы и раз в час

MarkoPolo
> Прикольный синтаксис у SQL. =) Прямо-таки предложения.
у smalltalk похоже

Программа Access от компании Microsoft предоставляет пользователям широкие возможности для создания и работы с базами данных. В наше время базы данных очень широко используются во всевозможных сферах и областях. В целом, можно сказать, что сейчас без них не обойтись. В связи с этим, очень важно уметь работать с таблицами Access. Основным элементом взаимодействия пользователя с базой данных является запрос. В этой статье подробно рассмотрим, как создать запрос в Access. Давайте же начнём. Поехали!

Access: делаем запросы

Прежде всего, разберёмся с тем, что такое запрос. Это элемент базы данных, который служит для выбора нужной информации из таблицы. Они бывают двух видов:

  • На выборку (позволяют получать данные и выполнять операции над ними);
  • На изменение (позволяют добавлять, удалять и изменять значения).

Отбор данных с условием

Указав условие для отбора данных, мы получаем нужную выборку


Начинающим разработчикам приложений под Microsoft сервер необходимо знать, как делать запросы в Access. Microsoft Access – самая популярная программа для работы с базами данных в Windows. Основной причиной успеха программы является интерактивный интерфейс.

Запросы или команды предоставляют возможность извлекать и фильтровать информацию, вычислять итоги, а также обновлять, перемещать и удалять записи в большом количестве. Освоение команд Microsoft Access улучшит способность программистов управлять данными и упростит разработку приложений.

Визуальное представление таблиц и графических связей между ними делает запросы Microsoft Access чрезвычайно простыми в использовании. Приятный пользовательский интерфейс по-прежнему позволяет выполнять очень мощный и расширенный анализ. Весь механизм смоделирован на системах SQL и может переключаться между графическим дизайном и синтаксисом SQL.

Разработчики сами делают выбор: использовать готовый конструктор или писать код на SQL. Но стоит помнить, что знание многих функций Microsoft Access позволяет быстро выполнять расширенную обработку данных без программирования.

Виды запросов

Microsoft Access поддерживает множество типов. Описание главных категорий:

  1. Select позволяет получать записи или сводки (итоги).
  2. Создание таблиц. Аналогично к Select, но результаты помещаются в таблицу, которая создается автоматически.
  3. Добавление. Аналогично первым двум, но результаты добавляются в существующую таблицу.
  4. Update изменяет (обновляет) данные в записях.
  5. Delete.

Команда Select является наиболее распространенной и может использоваться для просмотра и выбора данных для форм, отчетов, элементов управления и других операций. Другие типы создают или изменяют данные и вместе называются запросами действий.

Запросы на примере Select

Для создания команды с помощью конструктора следует выполнить такие действия:

Настройка условий и их типы

Нижняя часть сетки QBE состоит из нескольких строк для условий. Эти дополнительные строки необходимы для того, чтобы указать, какие записи будут получены.

Здравствуйте! Есть таблица с книгами и поле kol, нужно найти 5 самых больших значения в поле kol, но как это сделать, так и не нашел, буду очень благодарен за помощь!)

select *
from books
order by kol desc
fetch first 5 rows only

пс. не заметил, что access. тогда наверное limit 5

I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

вот запрос
SELECT T_kniga.kol_vid
FROM T_kniga
order by kol_vid desc
fetch limit 5 rows only

Акцесс говорит "ошибка в предложении order by" и выделяет всю строку
"fetch limit 5 rows only"

SELECT T_kniga.kol_vid
FROM T_kniga
order by kol_vid desc
limit 5

I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Здравствуйте chircov090993.
pproger предложил верную конструкцию, но с синтаксисом SQL ошибся 2 раза.
в MS Access конструкция выглядит так

Читайте также: