En utilisant MySQL, comment puis-je sélectionner rang des résultats de la recherche d'une ligne particulière?

StackOverflow https://stackoverflow.com/questions/1262448

  •  12-09-2019
  •  | 
  •  

Question

J'ai passé pas mal de temps aujourd'hui d'essayer différentes choses, mais aucun d'entre eux semblent fonctionner. Voici ma situation, je voudrais être en mesure de choisir le rang d'une ligne, basé sur l'ID d'une ligne spécifique trié

Par exemple, si ma requête est quelque chose comme:

SELECT id, name FROM people ORDER BY name ASC

avec des résultats tels que:

id   name
3    Andrew
1    Bob
5    Joe
4    John
2    Steve

Je voudrais obtenir le rang (quelle ligne il finit dans les résultats) sans retourner toutes les lignes et les jeter en boucle jusqu'à ce que j'arrive à celui que je veux (en PHP).

Par exemple, je voudrais pour sélectionner le « rang » de « Steve » pour qu'il revienne - dans ce cas - 5 (pas sa carte d'identité, mais le « rang » de son nom dans la requête ci-dessus) .

De même, je voudrais être en mesure de choisir le rang de ce que la ligne a l'ID 1. Pour cet exemple, je voudrais revenir un « rang » de 2 (parce que c'est à ce résultat ligne il y a un ID de 1) et rien d'autre.

Je suis Google'd autant que possible avec des résultats variables ... soit ayant des requêtes très lentes pour les tables plus ou avoir à créer toutes sortes de tables temporaires et variables utilisateur (l'ex-je vraiment éviter , ce dernier, je suppose que je peux vivre avec).

Toute aide ou aperçu serait grandement apprécié.

Était-ce utile?

La solution

artfulsoftware :

SELECT p1.id, p1.name, COUNT( p2.name ) AS Rank
    FROM people p1
    JOIN people p2 
    ON p1.name < p2.name
    OR (
         p1.name = p2.name
         AND p1.id = p2.id
    )
GROUP BY p1.id, p1.name
ORDER BY p1.name DESC , p1.id DESC
LIMIT 4,1

Autres conseils

Quelque chose comme ça?

SELECT Row, id, name
FROM (SELECT @row := @row + 1 AS Row, id, name
      FROM people
      ORDER BY name ASC)
WHERE Row = @SomeRowNumber

Si vous voulez aller de l'ID, modifier simplement la clause where.

Essayez ceci:

SELECT @rownum:=@rownum+1 `rank`, p.id, p.name
FROM people p, (SELECT @rownum:=0) r
ORDER BY name ASC

J'essaie de ce code ... peut aider les autres Je reçois résultat des utilisateurs et télécharger table pour photo de profil d'utilisateur et le joindre que je suis après le calcul des points de l'utilisateur et le tri sur eux. Enfin, je suis la vérification et l'ajout de numéro de ligne pour le classement pour les utilisateurs ... Injoy il. merci

set @row_num = 0;
set @calp =0;
select  if(@calp=(@calp:=user.cal_points), @row_num, @row_num := @row_num + 1) as row_number,user.* from 
(select user_skills.*,users.username,upload.file_name from user_skills join users on user_skills.user_id=users.id join upload on upload.upload_id=users.profile_pic order by user_skills.cal_points desc) as user
WHERE user.skill_name LIKE  '%ph%'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top