Из-за того, что MySQL общеизвестно труден, когда дело доходит до обновления запрашиваемых таблиц (см., Например, ответы от Dems), лучшее, что я могу выяснить, это, к сожалению, более чем одно утверждение, но с положительной стороны, вполне читабельное;
CREATE TEMPORARY TABLE Dump AS SELECT id FROM table1 WHERE id NOT IN
(SELECT MIN(id) FROM table1 GROUP BY city,item UNION
SELECT MAX(id) FROM table1 GROUP BY city,item);
DELETE FROM table1 where id in (select * from Dump);
DROP TABLE DUMP;
Не уверен, было ли важно, какой дубликат был удален, это сохраняет первый и последний.