Код
$res = sql_query("SELECT userid, COUNT(*) AS tnum FROM peers WHERE seeder = 'yes' GROUP BY userid") or sqlerr(__FILE__,__LINE__);
if(mysql_num_rows($res) > 0)
while($row = mysql_fetch_array($res))
sql_query("UPDATE users SET bonus = bonus + ".round($row['tnum'] * $points_per_cleanup, 2)." WHERE users.id = ".$row['userid']) or sqlerr(__FILE__,__LINE__);
if(mysql_num_rows($res) > 0)
while($row = mysql_fetch_array($res))
sql_query("UPDATE users SET bonus = bonus + ".round($row['tnum'] * $points_per_cleanup, 2)." WHERE users.id = ".$row['userid']) or sqlerr(__FILE__,__LINE__);
От такой конструкции генерируется большое количество запросов, помогите объединить в один. Пробовал так:
Код
UPDATE users SET bonus = bonus + ROUND(tnum * $points_per_cleanup,2) WHERE users.id = IN (SELECT userid, COUNT(*) AS tnum FROM peers WHERE seeder = 'yes' GROUP BY userid)
но выдалась ошибка, т.к. подзапрос должен возвращать всего один столбец... Существуют ли другие пути?
Спустя 1 день, 10 часов, 6 минут, 57 секунд (15.06.2008 - 02:05) Alchemist написал(а):
Код
UPDATE `users` INNER JOIN (
SELECT `userid`, COUNT(*) AS `tnum`
FROM `peers`
WHERE `seeder` = 'yes'
GROUP BY `userid`
) `tmp` USING(`userid`)
SET
`users`.`bonus` = `users`.`bonus` + ROUND(`tmp`.`tnum` * ".$points_per_cleanup.", 2)
WHERE 1
SELECT `userid`, COUNT(*) AS `tnum`
FROM `peers`
WHERE `seeder` = 'yes'
GROUP BY `userid`
) `tmp` USING(`userid`)
SET
`users`.`bonus` = `users`.`bonus` + ROUND(`tmp`.`tnum` * ".$points_per_cleanup.", 2)
WHERE 1