En général ORDER BY dans une sous-requête n'a aucun sens. (Il ne le fait que lorsqu'il est combiné avec FETCH FIRST/LIMIT/TOP etc.)
La solution consiste à utiliser une sous-requête corrélée pour trouver le poisson le plus lourd pour le nom d'utilisateur, l'emplacement et la combinaison d'espèces de la ligne actuelle de la "requête principale". S'il y a égalité, les deux lignes seront renvoyées.
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)
Notez que char pour le poids est toujours un mauvais choix, car vous devez lancer les deux côtés lors de la comparaison des valeurs. Revenez au nombre décimal dans votre tableau !