Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: SQL - помогите, пожалуйста, с составление запросов
if(mysql_query("UPDATE `accounts` SET `lastpay`=round(`credits`/'100'*'$procent',2), `credits`=round(`credits`+(`credits`/'100'*'$procent'),2) WHERE `banned`='0'"))
{
$res=mysql_query("SELECT `lastpay`, `id` FROM `accounts`");
Вполне устраивает. Очень быстро прибавляет нужную сумму к credits всех аккаунтов, у которых banned = 0.
А далее идёт говнокод... Выполняется запрос всех полей из таблицы accounts и всё это обрабатывается в цикле. т.е. на каждый аккаунт выполняется около 4 запросов. Всего аккаунтов 30000, т.е. в общем выполняется 120000 запросов, что меня оооочень не устраивает.
Знаю, что всё это можно сделать за 3-6 запроса. Но не так силен в SQL и прошу помощи в их составлении. Все данные, которых не достаточно - предоставлю.
Этот запрос добавляет информацию в таблицу логов. В самом первом запросе мы прибавили определенную сумму к `credits` каждого аккаунта и установили всем аккаунтам в `lastpay` эту сумму, которую прибавили. В этом запросе мы вписываем в таблицу accr-logs запись для каждого аккаунта тот самый lastpay и date. т.е. если аккаунтов 30000, то в конечном итоге будет выполнено 30000 запросов INSERT и в таблице accr-logs прибавится 30000 строк.
Хотелось бы этот запрос как-то оптимизировать, чтобы не нужно было совершать 30000 запросов. Быть может, нужно как-то объединить первый запрос на UPDATE и этот на INSERT. Но как?
mysql_query("UPDATE `accounts` SET `credits`=`credits`+'$l1', `ppay`=round(`ppay`+'$l1',2) WHERE `id`='".$row1['partnerid']."'");
mysql_query("UPDATE `referals` SET `payniki`=`payniki`+'$l1' WHERE `referalid`='".$row['id']."' AND `partnerid`='".$row1['partnerid']."'");
Примерно то-же самое, только с UPDATE. Скажите, пожалуйста, возможно ли применить примерно такую-же конструкцию запроса как выше с INSERT, только с UPDATE? Если нет, то я опишу всё подробнее. Спасибо!
mysql_query("INSERT INTO `accr-logs` (`user`,`credits`,`date`) SELECT `id`, `lastpay`, '$date' FROM `accounts` WHERE lastpay>0");
mysql_query("UPDATE `referals`, `accounts` SET `referals`.`payniki`=round(`referals`.`payniki`+(`accounts`.`lastpay`/'100'*'$procref'),2), `referals`.`lastpay`=round(`accounts`.`lastpay`/'100'*'$procref',2) WHERE `referals`.`referalid` = `accounts`.`id`");
mysql_query("UPDATE `accounts`, `referals` SET `accounts`.`credits`=`accounts`.`credits`+`referals`.`lastpay`, `accounts`.`ppay`=`accounts`.`ppay`+`referals`.`lastpay` WHERE `accounts`.`id`=`referals`.`partnerid`");
if(mysql_query("UPDATE `accounts` SET `lastpay`=round(`credits`/'100'*'$procent',2), `credits`=round(`credits`+(`credits`/'100'*'$procent'),2) WHERE `banned`='0'"))
{
mysql_query("INSERT INTO `accr-logs` (`user`,`credits`,`date`) SELECT `id`, `lastpay`, '$date' FROM `accounts` WHERE lastpay>0");
mysql_query("UPDATE `referals`, `accounts` SET `referals`.`payniki`=round(`referals`.`payniki`+(`accounts`.`lastpay`/'100'*'$procref'),2), `referals`.`lastpay`=round(`accounts`.`lastpay`/'100'*'$procref',2) WHERE `referals`.`referalid` = `accounts`.`id`");
mysql_query("UPDATE `accounts`, `referals` SET `accounts`.`credits`=`accounts`.`credits`+`referals`.`lastpay`, `accounts`.`ppay`=`accounts`.`ppay`+`referals`.`lastpay` WHERE `accounts`.`id`=`referals`.`partnerid`");
}
}
mysql_query("DELETE FROM `block-ip` WHERE `id`>'0'");
Еще раз всем спасибо! Panoptik ссылка очень помогла, спасибо!
Чуть позже отпишусь за сколько теперь это всё обрабаытвает 30к аккаунтов) (Добавление)
Все 30000 аккаунтов обрабатываются за 2.5 секунды => 12000 аккаунтов в секунду
Раньше было около 5 аккаунтов в секунду. Да здравствует SQL!
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.