SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.01.2014 15:36:00

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Update внутри IF внутри Select :(_)

Привет.

ПОдскажите, пожалуйста, какой-то вменяемый способ решить следующую задачу:

SELECT *,
    tr.team1_rate as t1r,
    if(`tr`.`team1_rate` is not null, `tr`.`team1_rate`+1, update team_rate set team1_rate = 200 where `team_rate`.`match_id` = `id`) as `team1_rate`,
from `match`, (select `team1_rate` from `team_rate` where `team_rate`.`match_id` = `id`) as tr

Т.е. ЭТА конструкция не работает.

Что нужно - выбираем team1_rate из таблицы team_rate по соответствию поля `team_rate`.`match_id` = `id`,
дальше проверяем, что у нас выбралось - если team1_rate не null, то выводим его (ну + 1), а вот если там пусто, то нужно выполнить этот запрос - update team_rate set team1_rate = 200  where `team_rate`.`match_id` = `id` и, главное, вывести это самое 200 в селекте.

Хотя и это нефинальный вариант задачи, но пока уперся в это...

Отредактированно Bust_Ed (25.01.2014 15:37:52)

Неактивен

 

#2 25.01.2014 15:43:02

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Update внутри IF внутри Select :(_)

В такой постановке вы задачу не решите. Можно с помощью if выводить 200, но обновить при этом нельзя.

Неактивен

 

#3 25.01.2014 18:01:36

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Update внутри IF внутри Select :(_)

Спасибо, подумаю насчет других методов, отпишусь тогда.

Неактивен

 

#4 25.01.2014 18:08:54

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Update внутри IF внутри Select :(_)

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

Неактивен

 

#5 25.01.2014 18:43:11

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Update внутри IF внутри Select :(_)

Та не, как запустить апдейт - это понятно, там логика четкая. Вот смотрите:

таблица 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 тоже самое.

Перечитал еще раз, понял, что это у меня в голове все понятно, а человеку со стороны без пол-литры не разобраться, что мне надо... Рисунок, что ли, нарисовать...

Неактивен

 

#6 25.01.2014 18:48:31

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Update внутри IF внутри Select :(_)

Кстати, есть еще мысль, как это попроще сделать, но вопрос такой - можно ли как-то обратиться к результату текущего селекта внутри этого селекта?

Ну, т.е., если вывод такой:
id team1 team1_points team1_rate
1  5           5                  6
2  6           5                  7
3  5           5                (team1 с id 5 уже есть, значит здесь должен быть ее предыдущий team1_rate + 1, т.е. 7)

Неактивен

 

#7 25.01.2014 18:51:43

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Update внутри IF внутри Select :(_)

А почему возникает разница? По идее при обновлении таблицы `match` нужно обновлять и team_rate.

Неактивен

 

#8 25.01.2014 18:53:28

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Update внутри IF внутри Select :(_)

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)

С помощью пользовательских переменных, см статью

Неактивен

 

#9 25.01.2014 18:54:54

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Update внутри IF внутри Select :(_)

Все верно, если бы это так было - я бы не занимался этим геморроем. Но это на будущие записи. А по факту есть таблицы с результатами за 5 лет. Там есть все данные, но нет team_rate, который нужно добавить. Вот я и думаю, как его добавить. Да и вообще, по бОльшему счету, хранить team_rate - это не очень правильно, т.к. это вычисляемое поле, там жесткая привязка к результатам, которые уже есть в таблице.

Статью пошел читать, спасибо.

Отредактированно Bust_Ed (25.01.2014 18:55:21)

Неактивен

 

#10 25.01.2014 19:09:55

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Update внутри IF внутри Select :(_)

ПП, кажется, не подойдут. smile

600 команд, 600 переменных заводить? smile можно было бы через массив, но не хочется лезть в 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 это не очень очевидно получается..

Неактивен

 

#11 25.01.2014 19:20:27

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Update внутри IF внутри Select :(_)

Зачем 600? Одна переменная, которая сбрасывается при переходе на другую команду (таблицу нужно обходить в определенном порядке).

Только я немного потерял нить рассуждений. Вы что именно хотите: сделать разово заполнение таблицы team_rate на основе старых данных или что-то другое?

Неактивен

 

#12 25.01.2014 19:49:58

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Update внутри IF внутри Select :(_)

Таблицу нужно обходить в определенном порядке... Гениально. Как же сам-то не догадался...

Старые данные "фиксируются" раз в пол-года. Так вот, мне нужно заполнить team_rate старыми данными и зафиксировать, а потом в течение пол-года выводить team_rate по меняющимся данным (там есть свои заморочки, опять же) в "динамическом" режиме.

Неактивен

 

#13 25.01.2014 19:52:27

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Update внутри IF внутри Select :(_)

На самом деле, пойду еще на ПП подумаю. Если получится вычислять рейтинг без сохранения в таблицу - это даже лучше.

Хотя определенный порядок не получится.

Порядок именно такой, какой есть, т.е. по дате игры. Там идет завязка на предыдущий рейтинг одной команды и второй. И нельзя посчитать сначала рейтинг одной команды по всем играм, а потом второй и так далее. Потому что рейтинг по формуле считается

D = (150 - Pв + Pп) * К / 10

Pв - рейтинг выигравшей команды до начала игры,
Pп - рейтинг проигравшей команды до начала игры,
К - коэффициент полученных очков в матче

Вот.

Отредактированно Bust_Ed (25.01.2014 19:54:54)

Неактивен

 

#14 25.01.2014 20:10:55

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Update внутри IF внутри Select :(_)

Кстати, есть мысль воспользоваться вместо массива временной таблицей. Сохраняю туда данные и оттуда же считываю. Только опять упираюсь в то, что update внутри If получается. Эх.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson