Здравствуйте.
Если тема уже поднималась, то извините, не нашел ответа.
Существует приложение, которое крутится на стороннем сервере, допустим игра. Пользователи авторизуются на том же сервере, у каждого пользователя, есть свое уникальное id (к примеру, целое от 0 до 10000000). Я хочу сохранять максимальное количество баллов, набранное пользователем, в своей БД. Для этого я создал таблицу:
CREATE TABLE IF NOT EXISTS `TestYourSpeed_records` (
`viewer_id` int(11) NOT NULL,
`speed` int(11) NOT NULL,
PRIMARY KEY (`viewer_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
В которую соотв. заносится id пользователя, если не существует, и записывается или обновляется (если больше предыдущего) результат (speed). Записей теоретически может быть более миллиона. Значения в колонке speed не уникальны и могут совпадать, поэтому я решил считать значение текущего пользователя, более весомым чем остальных с таким же результатом и выводить его первее, результаты т.о. у разных юзеров могут не совпадать, что плохо.
Теперь мне необходимо сделать выборку "топ 10" из БД. Решил ее делать без учета текущего пользоваля:
SELECT * FROM TestYourSpeed_records WHERE viewer_id != $viewer_id ORDER BY speed DESC LIMIT 10;
Рейтинг текущего юзера нахожу след. образом:
SELECT COUNT(*) AS count FROM TestYourSpeed_records
WHERE speed > (SELECT speed FROM TestYourSpeed_records WHERE viewer_id = $viewer_id)
Далее уже можно вывести топ с учетом этого рейтинга.
Что-то мне подсказывает, что это не оптимальное решение вопроса.
Может быть лучше пересортировывать таблицу, при внесении изменений, т.е., чтобы значения скорости были упорядочены в самой таблице от большего к меньшему? (Может это как-то автоматизировать можно?) Возможно нужно саму БД спроектировать по другому.. Не представляю, правда, каким образом это сделать. В общем, не хватает знаний для правильного решения этого вопроса. Кто что думает по этому поводу, какие идеи?
Подмогните, кто чем сможет... .
Отредактированно udaaff (24.11.2009 09:18:38)