Tato technika spojuje tabulku proti sobě v dílčím dotazu, ale odpovídá pouze jednomu řádku (na základě contact_id a párování e-mailů. Trik je v tom, že dílčí dotaz vrací pouze jednu z e-mailových adres pomocí MIN, teoreticky první v abecedním pořadí (nespolehlivé, ale řekl jste, že na tom nezáleží).
Testoval jsem to s dobrými výsledky.
UPDATE
email
JOIN (SELECT contact_id, MIN(email) as email
FROM email GROUP BY contact_id) as singles
USING(contact_id, email)
set is_primary=1;