La raison pour laquelle cela ne fonctionne pas est que MySQL ne vous permet pas de référencer la table que vous mettez à jour (cancome) dans une sous-requête.
Cela peut cependant être surmonté en utilisant une requête au lieu de la table elle-même dans le FROM, ce qui a pour effet de copier les valeurs de table demandées au lieu de référencer celle que vous mettez à jour.
Donc effectivement ceci, même si contre intuitif, fonctionnera :
DELETE FROM cancome WHERE user_id IN
( SELECT user_id FROM (SELECT * FROM cancome) AS cancomesub
GROUP BY user_id HAVING COUNT(user_id)>3 )
limit 3