|
PHP / MySQL Создание динамических Веб-ресурсов |
18.06.2014, 14:48
|
#1
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Порядок выполнения в Update
Допустим есть такой запрос:
UPDATE table_name SET avg = avg * count/(count + 1) + :newValue / (count + 1), count = count + 1 WHERE id = :id
Сработает ли такой запрос правильно или он может сначала посчитать count, а потом avg? Если он срабатывает правильно, то похоже у меня накапливается ошибка вычислений с вещественными числами в среднем значении...
|
(Offline)
|
|
18.06.2014, 15:19
|
#2
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Порядок выполнения в Update
Сделал тест, SET выполняются по очереди (слева на право).
Странная у тебя там формула Average. Но ты можешь использовать ROUND(X, D) где D - степень точности для округления, например если D=2, то ROUND(0.0165, 2) == 0.02
А вообще лучше избегать любые "накопительные" операции с float числами где только возможно. Лучше пересчитать, чем накапливать.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.06.2014, 15:29
|
#3
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Порядок выполнения в Update
А есть другие варианты?
Я не храню инфу о всех элементах последовательности для среднего, поэтому исходя из текущего среднего и количества элементов мне надо получить новое добавляя новый элемент.
UPD: вероятно есть вариант использовать N последних чисел в последовательности. Например если N = 100, то будет примерно так:
UPDATE table_name SET avg = avg * (99/100) + :newValue / 100 WHERE id = :id
И не хранить count в таблице...
|
(Offline)
|
|
18.06.2014, 16:37
|
#4
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Порядок выполнения в Update
А сколько примерно будет записей для просчета общего? 10, 100, 1000?
Т.к. в SQL есть SUM, делать это каждый раз - может быть тяжеловато если слишком много записей, или если эта query часто выполняется.
|
(Offline)
|
|
18.06.2014, 17:58
|
#5
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Порядок выполнения в Update
Фактически это среднее время трассы, т.е. каждый финиш игроков на трассе будет фиксироваться. Я думаю будет не мене десятков тысяч
|
(Offline)
|
|
18.06.2014, 18:21
|
#6
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Порядок выполнения в Update
если каждое время фиксируется в базе, то не проще ли сначала посчитать сумму этого времени, а потом поделить ее на число записей в базе?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.06.2014, 18:25
|
#7
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Порядок выполнения в Update
HolyDel именно. Тем более статистика "сколько времени откатался" тоже приятная, и всего-то поделить на число раундов, и вот вам среднее.
|
(Offline)
|
|
18.06.2014, 18:54
|
#8
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Порядок выполнения в Update
Я наверное не так выразился, каждое время в плане среднего времени, если сохранять в базе все финиши игроков на трассах, та это просто ппц объемы будут.
К примеру 10 игроков, до финиша можно доехать за 30 секунд, заезд 20 минут. Т.е. в худшем случае на 10 игроков за заезд будет 400 финишей. И это только одна игра. А если будет одновременно играть несколько тысяч игроков (сотни заездов)?
Сейчас я сохраняю лучшее время игрока на трассе и лучшее время трассы. Нужно среднее время трассы для расчета бонусов и рейтинга.
Если хранить сумму всего времени и число финишей, то я не знаю на сколько большое число может получиться... я храню время целым числом в сотых долях секунды. 10 секунд это 1000 в бд.
|
(Offline)
|
|
18.06.2014, 20:52
|
#9
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Порядок выполнения в Update
В UNSIGNED BIGINT вмещается 18446744073709551615 ужасно много (599,730,287,456 лет), так что не беспокойся, вместится.
|
(Offline)
|
|
18.06.2014, 21:42
|
#10
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Порядок выполнения в Update
вопще давать бонусы за среднее время карты, которое рассчитывается динамически от действий игроков, имхо, некорректно.
у тебя появятся 100500 твинков, которые будут спецом ехать медленно, чтобы мейны поулчали бонусы за проезд. тебе это надо? проедь трассу сам с рядом знакомых, посмотри ее время - оно пусть и будет бонусным.
если увидишь что бонусы падают слишком часто - уменьшаешь время на 3 секунды, слишком редко - увеличиваешь.
|
(Offline)
|
|
18.06.2014, 21:58
|
#11
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Порядок выполнения в Update
а лучше бонус если время лучше чем у 95% игроков (или другой процент)
__________________
|
(Offline)
|
|
18.06.2014, 22:01
|
#12
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Порядок выполнения в Update
Угу, бонус от статистического. Таким образом все могут получить бонус за хорошую езду, и будет честно - только лучшие.
Естественно нужен также бонус за 1/2/3 место, но это другое.
|
(Offline)
|
|
19.06.2014, 01:02
|
#13
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Порядок выполнения в Update
Уговорили, сделаю сумму времени в int64, а по поводу подсчета бонусов еще не решено все. Мне сейчас нужны данные, которые я смогу как-то использовать потом. Баланс довольно сложно придумать в заездах, где будут участвовать разные машины (по скорости и управляемости). Возможно все еще не один раз поменяется...
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:42.
|