Ah, me he confundido un poco (en realidad mucho xD), pensé que en MySQL también había algo como FOR EACH STATEMENT, tampoco tenía MySQL instalado para probar. Debería ser así:
DELIMITER $$
CREATE TRIGGER disp BEFORE UPDATE ON anuncio
FOR EACH ROW BEGIN
IF NEW.fav=1 THEN
UPDATE anuncio SET fav= 0;
END IF;
END $$
DELIMITER ;
PERO
#1442 - Can't update table 'anuncio' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Pues
B.5.9: Can triggers access tables?
A trigger can access both old and new data in its own table. A trigger can also affect other tables, but it is not permitted to modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger.
http://dev.mysql.com/doc/refman/5.5/en/faqs-triggers.html#qandaitem-B-5-1-9Así que para este caso creo que no podrás usar un trigger, tal vez deberías usar un store procedure y en vez de hacer UPDATE directamente en la tabla llamarías al procedure, algo como update_anuncio(int id, int estado)