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`");
web-master, так как ты предлагаешь без циклов не выйдет - поля `cfrom`>`cto` в другой таблице живут.
08 Янв 2012, 17:53Kovalsky, во бл.. точно
тогда так
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`)");
web-master, опять мимо
вот в этом месте не сработает - `id_user`='".$field['id']."'
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`))");
чет я сеня нах не соображаю 
не будет такое работать. Будет ошибка что то типо "Subquery returns more than 1 row"
08 Янв 2012, 22:07web-master, согласен с предыдущим оратором...
я вот непонимаю, неужели join сложнее всяких вложенных запросов?
думаю если автор отказался от примера запроса с join сказав что он очень сложный, то даже если вы нароете правильный вложенный запрос то он ему еще сложней покажется (я как бы не думал в эту сторону, но подозреваю что в таком запросе будет update + 2 вложенных select)
Как вариант:
В битриксе всегда так делаем.
Сначала 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`;");
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).")");
}