Xwab
Форумыnavigate_nextПрограммирование на PHP

Как облегчить код?
Сообщения
web-master

megavolt, тут по моему можно обойтись без циклов

mysql_unbuffered_query("UPDATE `".prefix."url` SET
`activ`='0'
WHERE (`activ`='1' AND `moder`='0' AND `id_user`='".$field['id']."') AND `cfrom`>`cto`");

mysql_unbuffered_query("UPDATE `".prefix."url` SET
`activ`='1'
WHERE (`activ`='0' AND `moder`='0' AND `id_user`='".$field['id']."') AND `cfrom`<=`cto`");

mysql_query("OPTIMIZE TABLE `".prefix."url`, `".prefix."users`");

08 Янв 2012, 17:51
RiO

Читай книги по MySQL , ваш КО

08 Янв 2012, 17:51
Kovalsky

web-master, так как ты предлагаешь без циклов не выйдет - поля `cfrom`>`cto` в другой таблице живут.

08 Янв 2012, 17:53
web-master

Kovalsky, во бл.. точно
тогда так
mysql_unbuffered_query("UPDATE `".prefix."url` SET
`activ`='0'
WHERE (`activ`='1' AND `moder`='0' AND `id_user`='".$field['id']."') AND (SELECT `id` FROM `".prefix."users` WHERE `cfrom`>`cto`)");

mysql_unbuffered_query("UPDATE `".prefix."url` SET
`activ`='1'
WHERE (`activ`='0' AND `moder`='0' AND `id_user`='".$field['id']."') AND (SELECT * FROM `".prefix."users` WHERE `cfrom`<=`cto`)");

08 Янв 2012, 17:56
Kovalsky

web-master, опять мимо
вот в этом месте не сработает - `id_user`='".$field['id']."'

08 Янв 2012, 17:59
web-master

Kovalsky, да ёлы палы

может так
mysql_unbuffered_query("UPDATE `".prefix."url` SET
`activ`='0'
WHERE (`activ`='1' AND `moder`='0' AND `id_user`=(SELECT `id` FROM `".prefix."users` WHERE `cfrom`>`cto`))");

mysql_unbuffered_query("UPDATE `".prefix."url` SET
`activ`='1'
WHERE (`activ`='0' AND `moder`='0' AND `id_user`=(SELECT * FROM `".prefix."users` WHERE `cfrom`<=`cto`))");

чет я сеня нах не соображаю

08 Янв 2012, 18:06
FustCon

не будет такое работать. Будет ошибка что то типо "Subquery returns more than 1 row"

08 Янв 2012, 22:07
Kovalsky

web-master, согласен с предыдущим оратором...

я вот непонимаю, неужели join сложнее всяких вложенных запросов?
думаю если автор отказался от примера запроса с join сказав что он очень сложный, то даже если вы нароете правильный вложенный запрос то он ему еще сложней покажется (я как бы не думал в эту сторону, но подозреваю что в таком запросе будет update + 2 вложенных select)

08 Янв 2012, 22:13
FustCon

Как вариант:
В битриксе всегда так делаем.
Сначала ID заносим в массив.
В данном примере заношу сразу с припиской (`id_user` = ), чтобы второй раз массив не перебирать

$arQueryUsers = array();

$qq = mysql_query("SELECT `id` FROM `".prefix."users` WHERE `cfrom`>`cto`;");

if(($all = mysql_num_rows($qq)) > 0)
{
    while($field = mysql_fetch_array($qq))
    {
       $arQueryUsers[] = "`id_user` = '$field[id]'";
    }
}

if(sizeof($arQueryUsers) > 0)
   mysql_unbuffered_query("update `".prefix."url` set `activ`='0' where `activ` = '1' && `moder` = '0' and (" . implode(' OR ', $arQueryUsers) .");");


$arQueryUsers = array();

$qq = mysql_query("SELECT * FROM `".prefix."users` WHERE `cfrom`<=`cto`");

if(($all = mysql_num_rows($qq)) > 0)
{
    while($field = mysql_fetch_array($qq))
    {
       $arQueryUsers[] = "`id_user` = '$field[id]'";
    }
}
if(sizeof($arQueryUsers) > 0)
   mysql_unbuffered_query("update `".prefix."url` set `activ`='1' where `activ` = '0' && `moder` = '0' and (" . implode(' OR ', $arQueryUsers) .");");

mysql_query("OPTIMIZE TABLE `".prefix."url`, `".prefix."users`;");
--------------------------------
Если значения полей можно сравнить в PHP, то оптимизировать можно аж до след. кода:

$arQueryUsers1 = $arQueryUsers2 = array();

$qq = mysql_query("SELECT `id`, `cfrom`, `cto`  FROM `".prefix."users`");

if(($all = mysql_num_rows($qq)) > 0) {
   while($field = mysql_fetch_array($qq))
    {
       if($field['cfrom'] > $field['cto']) $arQueryUsers1[] = "`id_user` = '$field[id]'";
       else $arQueryUsers2[] = "`id_user` = '$field[id]'";
    }
}

if(sizeof($arQueryUsers1) > 0)
   mysql_unbuffered_query("update `".prefix."url` set `activ`='0' where `activ` = '1' && `moder` = '0' and (" . implode(' OR ', $arQueryUsers1) .");");

if(sizeof($arQueryUsers2) > 0)
   mysql_unbuffered_query("update `".prefix."url` set `activ`='1' where `activ` = '0' && `moder` = '0' and (" . implode(' OR ', $arQueryUsers2) .");");

mysql_query("OPTIMIZE TABLE `".prefix."url`, `".prefix."users`;");


__________
посл.ред. 08 Янв 2012, 22:43; всего 1 раз 08 Янв 2012, 22:29
Kovalsky

FustCon,
а не проще вариант с IN ?
даже стало интересно что быстрей работает масса OR или IN()
пойду погуглю ради интереса...

вариант с IN :

$qq = mysql_query("SELECT `id` FROM `".prefix."users` WHERE `cfrom`>`cto`;");
$id_in = array();
while($field = mysql_fetch_array($qq))
{
$id_in[] = $field['id'];
}
if(count($id_in))
{
mysql_unbuffered_query("update `".prefix."url` set `activ`='0' where `activ` = '1' AND `moder` = '0' AND `id_user` IN (".implode(',', $id_in).")");
}

08 Янв 2012, 22:40
Ответить на тему