Задавайте вопросы, мы ответим
Вы не зашли.
Привет.
ПОдскажите, пожалуйста, какой-то вменяемый способ решить следующую задачу:
Отредактированно Bust_Ed (25.01.2014 15:37:52)
Неактивен
В такой постановке вы задачу не решите. Можно с помощью if выводить 200, но обновить при этом нельзя.
Неактивен
Спасибо, подумаю насчет других методов, отпишусь тогда.
Неактивен
Методы зависят от задачи. Например, возможно вам подойдет периодический update по крону или обеспечение нужных значений с помощью триггеров или ...
Неактивен
Та не, как запустить апдейт - это понятно, там логика четкая. Вот смотрите:
таблица match, в ней поля (ну там много разных полей, но беру только интересующие)
id, date, team1, team2, team1points, team2points, have_result
по идее, в этой же таблице должен быть team1_rate и team2_rate, но в силу разных причин, в таблицу match изменения вносить не можем, поэтому получаем еще одну таблицу:
team_rate
id, match_id, team1_rate, team2_rate
Соотв, общая идея какая - при выводе данных идет проверка, что количество строк из `match`.`have.result` = 1 (т.е. результат игры записан) должно соответствовать количеству строк из `team_rate`.`team1_rate` is not null.
Как только разница такая есть - нужно вычислить team1_rate и team2_rate для соответствующего match_id и обновить данные. Так-то все просто, проблема в том, что вот это самое вычисление основывается на последнем значении `team_rate`.`team1_rate` для соотв. team1 ну и для team2 тоже самое.
Перечитал еще раз, понял, что это у меня в голове все понятно, а человеку со стороны без пол-литры не разобраться, что мне надо... Рисунок, что ли, нарисовать...
Неактивен
Кстати, есть еще мысль, как это попроще сделать, но вопрос такой - можно ли как-то обратиться к результату текущего селекта внутри этого селекта?
Ну, т.е., если вывод такой:
id team1 team1_points team1_rate
1 5 5 6
2 6 5 7
3 5 5 (team1 с id 5 уже есть, значит здесь должен быть ее предыдущий team1_rate + 1, т.е. 7)
Неактивен
А почему возникает разница? По идее при обновлении таблицы `match` нужно обновлять и team_rate.
Неактивен
Bust_Ed написал:
Кстати, есть еще мысль, как это попроще сделать, но вопрос такой - можно ли как-то обратиться к результату текущего селекта внутри этого селекта?
Ну, т.е., если вывод такой:
id team1 team1_points team1_rate
1 5 5 6
2 6 5 7
3 5 5 (team1 с id 5 уже есть, значит здесь должен быть ее предыдущий team1_rate + 1, т.е. 7)
С помощью пользовательских переменных, см статью
Неактивен
Все верно, если бы это так было - я бы не занимался этим геморроем. Но это на будущие записи. А по факту есть таблицы с результатами за 5 лет. Там есть все данные, но нет team_rate, который нужно добавить. Вот я и думаю, как его добавить. Да и вообще, по бОльшему счету, хранить team_rate - это не очень правильно, т.к. это вычисляемое поле, там жесткая привязка к результатам, которые уже есть в таблице.
Статью пошел читать, спасибо.
Отредактированно Bust_Ed (25.01.2014 18:55:21)
Неактивен
ПП, кажется, не подойдут.
600 команд, 600 переменных заводить? можно было бы через массив, но не хочется лезть в php пока.
в идеале, там идет
select id, team1, team1_points, if(select team1_rate from _РЕЗУЛЬТАТ ТЕКУЩЕГО ЗАПРОСА_ is not null, team1_rate, 0) from match
Где _РЕЗУЛЬТАТ ТЕКУЩЕГО ЗАПРОСА_ - это не готовый результат, а тот, который еще формируется. Т.е. если сравнивать с php, то идет набор данных в массив и прежде чем писать значение в переменную team1_rate идет проверка наличия этой переменной в массиве и если оно есть - то берется "предыдущее" значение этой переменной, к нему прибавляется 1 (это для примера) и уже записывается.
Сейчас уже начинаю подумывать, а не загнать ли мне всё это вычисление в Php... Как-то в MySQL это не очень очевидно получается..
Неактивен
Зачем 600? Одна переменная, которая сбрасывается при переходе на другую команду (таблицу нужно обходить в определенном порядке).
Только я немного потерял нить рассуждений. Вы что именно хотите: сделать разово заполнение таблицы team_rate на основе старых данных или что-то другое?
Неактивен
Таблицу нужно обходить в определенном порядке... Гениально. Как же сам-то не догадался...
Старые данные "фиксируются" раз в пол-года. Так вот, мне нужно заполнить team_rate старыми данными и зафиксировать, а потом в течение пол-года выводить team_rate по меняющимся данным (там есть свои заморочки, опять же) в "динамическом" режиме.
Неактивен
На самом деле, пойду еще на ПП подумаю. Если получится вычислять рейтинг без сохранения в таблицу - это даже лучше.
Хотя определенный порядок не получится.
Порядок именно такой, какой есть, т.е. по дате игры. Там идет завязка на предыдущий рейтинг одной команды и второй. И нельзя посчитать сначала рейтинг одной команды по всем играм, а потом второй и так далее. Потому что рейтинг по формуле считается
D = (150 - Pв + Pп) * К / 10
Pв - рейтинг выигравшей команды до начала игры,
Pп - рейтинг проигравшей команды до начала игры,
К - коэффициент полученных очков в матче
Вот.
Отредактированно Bust_Ed (25.01.2014 19:54:54)
Неактивен
Кстати, есть мысль воспользоваться вместо массива временной таблицей. Сохраняю туда данные и оттуда же считываю. Только опять упираюсь в то, что update внутри If получается. Эх.
Неактивен