2009-08-11 9 views
1

J'ai passé pas mal de temps à essayer différentes choses, mais aucune d'elles ne semble fonctionner. Voici ma situation, je voudrais être en mesure de choisir le rang d'une ligne, basé sur l'ID d'une ligne spécifiquement triéEn utilisant MySQL, comment sélectionner le rang de résultat d'une ligne particulière?

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

SELECT id, name FROM people ORDER BY name ASC 

avec des résultats comme:

 
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 sélectionner le 'rank' de 'Steve' pour qu'il renvoie - dans ce cas - 5 (pas son identifiant, mais le 'rank' de son nom dans la requête ci-dessus).

De même, je voudrais être en mesure de sélectionner le rang de n'importe quelle ligne a l'ID de 1. Pour cet exemple, je voudrais retourner un «rang» de 2 (parce que c'est dans quelle rangée de résultats là est un ID de 1) et rien d'autre. J'ai fait autant de choses que je le pouvais avec des résultats variables ... soit avoir des requêtes très lentes pour des tables plus grandes ou avoir à créer toutes sortes de tables temporaires et de variables utilisateur (la première que j'aimerais vraiment évite, ce dernier je suppose que je peux vivre avec).

Une aide ou un aperçu serait grandement apprécié.

Répondre

2

de 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 
+0

Après quelques petits changements, cela semble fonctionner très bien pour ce dont j'ai besoin.Cependant, une complication supplémentaire: serait-il possible de sélectionner un ensemble de lignes en fonction d'un ensemble de conditions (par exemple, uniquement les personnes qui ont un «J» dans leur nom - WHERE comme LIEN «% j%». , et bien que le champ de résultat 'rank' soit toujours pertinent, il saute des nombres pour ceux qui n'ont pas de J dans le nom. – theotherlight

2

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 passer par l'ID, modifiez simplement la clause where.

+0

Son erreur que chaque table dérivée donnant doit avoir son propre alias @Brandon –

1

Essayez ceci:

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

C'est comme ce que j'avais déjà venir avec recherche sur Google, et il fonctionne très bien si je veux que le « rang » de chaque rang dans les ma table, mais si je ne veux que le rang d'une seule rangée? J'ai essayé quelque chose comme

 SELECT @rownum:[email protected]+1 'rank', p.id, p.name FROM people p, (SELECT @rownum:=0) r WHERE id = 5 ORDER BY name ASC 
Mais cela me donnera toujours un rang de 1 (car il ne retourne que jamais un résultat). Existe-t-il un moyen d'obtenir le rang unique d'une seule ligne en fonction des résultats complets de la requête? J'espère que cela a du sens. – theotherlight

+0

comment obtenir un seul enregistrement avec ce rang particulier en utilisant votre requête @Plutor –

0

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 rejoignez-le qu'après que je calcule les points d'utilisateur et que je les trie. Enfin, je vérifie et ajoute le numéro de ligne pour le classement des utilisateurs ... Injoy it. grâce

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%' 
Questions connexes