Comment obtenir une ligne de rang?
SALUT,
J'ai effectivement posté similaire (ou le même?) la question hier, mais j'ai pensé que j'ai besoin de poster une nouvelle question depuis que j'ai court, mais clairement la question.
J'ai le tableau suivant.
id point
1 30
2 30
3 29
4 27
5 28
6 26
ce que je veux:
- obtenir tous les utilisateurs de la commande par rang. l'utilisateur #1 et #2 ont 1 comme leur rang de valeur parce qu'ils ont 30 points
- Je veux requête d'un rang par l'utilisateur. Je voudrais obtenir 1 comme le résultat de mon rang, quand j'ai une requête de l'utilisateur #1 et #2 parce que les deux d'entre eux ont 30 points
Ajouté le: 3/18
J'ai essayé de Logan requête, mais il a obtenu le résultat suivant
id point rank
1 30 1
2 30 1
3 29 3
4 27 5
5 28 4
6 26 6
Double Possible de la fonction ROW_NUMBER() de MySQL
OriginalL'auteur Moon | 2011-03-18
Vous devez vous connecter pour publier un commentaire.
La sous-requête approche que vous avez vu recommandée à l'échelle de quadratiquement. http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/ montre une approche beaucoup plus efficace avec les variables de l'utilisateur. Ici est non testé adaptation à votre problème:
J'ai essayé d'ajouter où la déclaration à la requête d'une ligne spécifiée, mais j'ai toujours 1 comme point_rank. voici ma requête
SELECT *, vote_ratio , @num := si( @vote_ratio = vote_ratio, @num @num +1 ) QUE le rang DE challenge_photos où img_status = 1 et img_id = 65 COMMANDE PAR vote_ratio DESC";
mention de votre pièce d'identité.
Ce que vous devez faire est de faire ce que j'ai écrit dans une vue, puis sélectionnez à partir de la vue. Si vous avez besoin d'accéder à la vue à plusieurs reprises, de l'enregistrer dans un tableau (qui peut être temporaire si vous le souhaitez), puis accéder aux.
OriginalL'auteur btilly
Juste de compter combien de personnes ont plus de points.
Cela vous donnera le nombre de personnes qui ont plus de points pour un utilisateur donné. Donc, pour l'utilisateur 1 et utilisateur 2, le résultat sera 0 (zéro), ce qui signifie qu'ils sont en premier.
OriginalL'auteur RDL
Quand j'avais besoin de faire quelque chose de similaire, j'ai créé un point de vue qui ressemblait à ceci:
Cela suppose que la table d'origine a été nommé points, évidemment. Ensuite, vous pouvez obtenir le grade de toute pièce d'identité, ou l'id correspondant à un grade, en interrogeant la vue.
MODIFIER
Si vous voulez compter le nombre de différentes valeurs de point au-dessus de chaque point de la valeur plutôt que le nombre d'entrées, avec des valeurs de point au-dessus de l'actuelle valeur de point, vous pouvez faire quelque chose comme:
NOTE
Certains des autres solutions présentées certainement faire mieux que cela. Ils sont mysql spécifique, donc je ne peux pas vraiment l'utiliser pour ce que je suis en train de faire. Ma demande a, au plus, 128 entités de rang, de sorte que cela fonctionne assez bien pour moi. Si vous pourriez avoir des tonnes de lignes, cependant, vous voudrez peut-être regarder à l'aide de l'une des autres solutions présentées ici ou limiter la portée de ce classement.
ORDER BY rank ASC
). Solution sympa.Je tiens à garder la plupart de mes SQL dans la base de données elle-même dans les vues et les procédures stockées.
ajoutée le résultat de la requête ci-dessus
est-il possible d'obtenir la valeur 2 pour id #2 au lieu de 3? Je sais que 3 a de sens puisqu'il y a deux rang #1, mais je me demande si je peut le définir comme #2 à la place de #3.
Qui ne devrait pas être un problème. Vous devez compter le nombre de différentes valeurs de point au-dessus de chaque point de la valeur plutôt que sur le nombre de lignes. Je vais modifier mon post.
OriginalL'auteur lo5an
L'OP voudrais avoir les numéros de plages ignoré si leur étaient auparavant double de points avec le même grade. E. g. ci-dessous voir comment 2 est ignorée parce rang 1 apparaît deux fois.
Ceci peut être réalisé en modifiant btilly du code comme suit:
OriginalL'auteur malhal
Tableau:les utilisateurs
Yep. Désolé à ce sujet. Merci pour l'arrimage. Réponse remanié
Lors de la refonte de votre réponse, vous ont reconnu que c'est la même idée que la réponse que j'ai posté avant vous remanié le vôtre.
Désolé. C'était vraiment un oubli. Ma solution: testé et vérifié à l'OP. Je crois que j'aime @Logan est mieux de toute façon. C'est plus direct et plus facile à lire - c'est plus simple.
Il est vrai que @Logan a une solution plus simple. Mais si vous avez 100 000 lignes de votre table, la performance va vous tuer.
OriginalL'auteur Dawson