CREATE TEMPORARY TABLE allDoubles ( SELECT vi.* FROM visit_items as vi JOIN (SELECT visit_id, item_id, tag, count(*) AS bar FROM visit_items GROUP BY item_id,visit_id,tag HAVING bar > 1 ) AS foo ON foo.item_id = vi.item_id AND foo.visit_id = vi.visit_id AND foo.tag = vi.tag ); CREATE TEMPORARY TABLE allGroupedDoubles ( SELECT * FROM allDoubles GROUP BY visit_id,item_id,tag ); DELETE FROM visit_items WHERE id IN (SELECT id FROM allDoubles) AND id NOT IN (SELECT id FROM allGroupedDoubles)