Cela peut être fait avec une seule requête
SELECT * FROM `char` WHERE char_id = (SELECT char_id FROM rankpvp ORDER BY ratio DESC LIMIT 1)
Notez que char est un mot réservé, il devra donc être entouré de tic-tac. C'est peut-être le problème réel que vous avez rencontré (erreur de syntaxe) plutôt qu'un problème avec votre boucle while. Néanmoins, une requête est la bonne manière