You are absolutely right.
You cannot currently update the same table as you select from, you have to use a sub-query which uses a temp table. This is an extremely slow method, but unfortunately, there seems to be no alternative in MySQL 5+.
UPDATE categories_copy c
SET `count` = (
SELECT `count` FROM
(
SELECT parent.idcategories, COUNT(deals.iddeals) AS `count`
FROM categories_copy AS node ,
categories_copy AS parent,
deals
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.idcategories = deals.idcategories
GROUP BY parent.idcategories
) AS `x` WHERE x.idcategories = c.idcategories
)
Hopefully in MySQL 6+ you will be able to do this.
As you quite rightly stated, this is possible in oracle.