In het algemeen heeft ORDER BY in een subquery geen zin. (Alleen in combinatie met FETCH FIRST/LIMIT/TOP etc.)
De oplossing is om een gecorreleerde subquery te gebruiken om de zwaarste vis te vinden voor de gebruikersnaam, locatie en soortcombinatie van de huidige rij van de "hoofdquery". Als het gelijk is, worden beide rijen geretourneerd.
SELECT *
FROM entries e1
WHERE username = :user
AND CAST(weight AS DECIMAL(9,3)) = (select max(CAST(weight AS DECIMAL(9,3)))
from entries e2
where e1.username = e2.username
and e1.location = e2.location
and e1.species = e2.species)
Merk op dat char voor gewicht nog steeds een slechte keuze is, omdat je beide kanten moet werpen bij het vergelijken van waarden. Ga terug naar decimaal in je tabel!