Il n'y a aucun moyen de calculer l'ordre (ce que vous appelez le rang) de quelque chose sans d'abord trier le tableau ou stocker le rang.
Si votre tableau est correctement indexé (indice de popularité), il est trivial pour la base de données de trier cela afin que vous puissiez obtenir votre classement. Je suggérerais quelque chose comme ce qui suit :
Tout sélectionner, y compris le classement
SET @rank := 0;
SELECT t.*, @rank := @rank + 1
FROM table t
ORDER BY t.popularity;
Pour récupérer un élément avec un "id" spécifique, vous pouvez simplement utiliser une sous-requête comme suit :
Sélectionnez-en un, y compris le rang
SET @rank := 0;
SELECT * FROM (
SELECT t.*, @rank := @rank + 1
FROM table t
ORDER BY t.popularity
) t2
WHERE t2.id = 1;