Você pode alterar ligeiramente sua consulta atual para obter os resultados desejados:
SELECT i.id, i.name -- OK to select name assuming id is the PK
FROM item i
LEFT JOIN relation r
ON i.id = r.item_id
LEFT JOIN tag t
ON t.id = r.tag_id
WHERE t.tag IN ('sport', 'leather')
GROUP BY i.id
HAVING COUNT(DISTINCT t.tag) = 2;
Isso retornaria todos os itens que possuem
sport
e leather
Tag. Ele funciona agregando por item (como você já estava fazendo), mas depois afirmando em um HAVING
cláusula de que existem duas tags correspondentes distintas. Como restringimos apenas essas duas tags no WHERE
cláusula, se o HAVING
verificação passa após a agregação, isso implica que o item é uma correspondência.