Est-il possible d'obtenir le numéro de ligne réel à partir d'une requête?
Je veux pouvoir commander une table appelée league_girl par un champ appelé score; et renvoyez le nom d'utilisateur et la position de ligne réelle de ce nom d'utilisateur.
Je veux classer les utilisateurs afin que je puisse dire où se trouve un utilisateur particulier, c'est-à-dire. Joe est en position 100 sur 200, c'est-à-dire
User Score Row
Joe 100 1
Bob 50 2
Bill 10 3
J'ai vu quelques solutions ici, mais j'ai essayé la plupart d'entre elles et aucune d'entre elles ne renvoie le numéro de ligne.
J'ai essayé ceci:
SELECT position, username, score
FROM (SELECT @row := @row + 1 AS position, username, score
FROM league_girl GROUP BY username ORDER BY score DESC)
Comme dérivé
... mais il ne semble pas retourner la position de la ligne.
Des idées?
Réponses:
Vous pouvez essayer ce qui suit:
La
JOIN (SELECT @curRow := 0)
pièce permet l'initialisation de la variable sans nécessiter deSET
commande séparée .Cas de test:
Requête de test:
Résultat:
la source
@curRow
en remplaçant l'JOIN
instruction par une virgule, comme ceci:FROM league_girl l, (SELECT @curRow := 0) r
ORDER BY
?la source
Voici la structure du modèle que j'ai utilisé:
Et voici mon code de travail:
la source
Vous pouvez aussi utiliser
pour initialiser la variable de compteur.
la source
@curRow
peut encore avoir une valeur de la dernière fois que vous avez exécuté cette requête dans la session en cours.En supposant que MySQL le prend en charge, vous pouvez facilement le faire avec une sous-requête SQL standard:
Pour de grandes quantités de résultats affichés, ce sera un peu lent et vous voudrez passer à une auto-jointure à la place.
la source
Si vous souhaitez simplement connaître la position d'un utilisateur spécifique après classement par score de champ, vous pouvez simplement sélectionner toutes les lignes de votre tableau où le score de champ est supérieur au score de l'utilisateur actuel. Et utilisez le numéro de ligne retourné + 1 pour savoir quelle position de cet utilisateur actuel.
En supposant que votre table est
league_girl
et que votre champ principal estid
, vous pouvez utiliser ceci:la source
J'ai trouvé la réponse originale incroyablement utile, mais je voulais également saisir un certain ensemble de lignes en fonction des numéros de ligne que j'insérais. En tant que tel, j'ai enveloppé toute la réponse d'origine dans une sous-requête afin de pouvoir référencer le numéro de ligne que j'insérais.
Avoir une sous-requête dans une sous-requête n'est pas très efficace, il vaudrait donc la peine de tester si vous obtenez un meilleur résultat en demandant à votre serveur SQL de gérer cette requête, ou en récupérant la table entière et en demandant à l'application / serveur Web de manipuler les lignes après coup .
Personnellement, mon serveur SQL n'est pas trop occupé, il était donc préférable de le faire gérer les sous-requêtes imbriquées.
la source
Je sais que l'OP demande une
mysql
réponse, mais comme j'ai trouvé les autres réponses ne fonctionnant pas pour moi,order by
Alors pour gagner du temps pour d'autres comme moi, indexez simplement la ligne après les avoir récupérées de la base de données
exemple en PHP:
exemple en PHP utilisant offset et limit pour la pagination:
la source