Requête SQL - Position dans un classement

Requête SQL - Position dans un classement - SQL/NoSQL - Programmation

Marsh Posté le 04-04-2012 à 09:21:31    

Bonjour à tous,
 
J'ai un petit soucis pour une requête SQL.
 
Voici les données :
ID | Nom | Vote_plus | Vote_moins
 
Je cherche à obtenir le classement de cette liste par l'addition de vote_plus et vote_moins.
 
Pour l'instant ma requête a cette tête :
SELECT *, vote_plus - vote_moins AS votes_total FROM ma_table ORDER BY votes_total DESC
 
Mais cela n'obtient évidemment pas la position dans le classement, mais remplit une des deux tâches à savoir le tri par score.
Les infos que je souhaite ainsi afficher sont : Le nom, le score total (addition de vote plus et vote moins) et la position dans le classement.
 
Est ce quelqu'un a une idée de la requête que je dois utiliser pour obtenir la position dans le classement ?
 
Merci par avance de votre aide  :jap:


Message édité par luckylp56 le 04-04-2012 à 10:41:57
Reply

Marsh Posté le 04-04-2012 à 09:21:31   

Reply

Marsh Posté le 04-04-2012 à 09:51:15    

Avec quelle base de données (Oracle, MySQL, ...) ?
 
Avec Oracle, la solution serait Select rownum, ...

Reply

Marsh Posté le 04-04-2012 à 10:34:47    

Au temps pour moi, j'ai oublié de préciser : c'est du MySQL.
 
Merci de ton aide olivthill
 
Ps : petit edit dans mon message précédent avec les infos que je souhaite obtenir


Message édité par luckylp56 le 04-04-2012 à 10:42:30
Reply

Marsh Posté le 05-04-2012 à 10:04:13    

Quelqu'un peut m'aiguiller ? Je suis assez autodidacte mais je sèche sur cette question.

Reply

Marsh Posté le 05-04-2012 à 22:57:24    

Je viens de passer deux heures desssus sans trouver de solution... Toute aide est la bienvenue :-)

Reply

Marsh Posté le 06-04-2012 à 14:13:01    

Habituellement une requête SQL s'utilise à l'intérieur d'un programme (est-ce le cas ici ? en quel language ? (PHP Java, autre ?)) et c'est la partie autour de la requête qui faire du reformatage, et qui éventuellement ajoute des numéros de ligne, etc.

Reply

Marsh Posté le 06-04-2012 à 15:13:30    

Salut,
 
Tu peux regarder ici, il y a la solution pour faire un équivalent de rownum en mysql : http://craftycodeblog.com/2010/09/ [...] ith-mysql/
(2è partie de la réponse, mais tout l'article est intéressant).
(sinon, d'accord avec olivthill, la présentation n'est pas vraiment du ressort du moteur de bdd)


Message édité par Tibar le 06-04-2012 à 15:14:26
Reply

Marsh Posté le 27-04-2012 à 12:10:44    

Merci Tibar, ta réponse m'a pas mal aidé !
 
Je m'en suis sorti avec un :
SELECT *, @rownum:=@rownum+1 AS rownum, vote_plus - vote_moins AS votes_total FROM ma_table, (SELECT @rownum:=0) r

Reply

Marsh Posté le 27-04-2012 à 14:56:15    

Up
 
Voici on j'en suis :
 
SELECT a.name,(SELECT COUNT(DISTINCT (b.vote_up - b.votes_down)) FROM com_items AS b WHERE (b.votes_up - b.votes_down) >= (a.votes_up - a.votes_down)) AS 'position' FROM matable AS a WHERE (SELECT COUNT(DISTINCT (b.votes_up - b.votes_down)) FROM matable AS b WHERE (b.votes_up - b.votes_down) >= (a.votes_up - a.votes_down)) BETWEEN ".$deb." AND ".$fin." ORDER BY position ASC LIMIT ".$lim.";
 
 
Vote up = Vote plus
Vote down = Vote moins
 
C'est barbar comme ça mais ça fonctionne correctement et me permet d'obtenir les classements entre 2 valeurs ($deb et $fin).

Reply

Marsh Posté le 03-05-2012 à 12:53:15    

Salut,
 
C'est peut être un peu plus lisible comme ça :  
 
SELECT * FROM
(
SELECT id as IDENTIFIANT
   --, nom as NOM  
     , vote_p - vote_m as SCORE
     , (SELECT COUNT(*) + 1
           FROM "XB_TMP"
          WHERE vote_p - vote_m > (t.vote_p - t.vote_m)) AS CLASSEMENT
  FROM "XB_TMP" AS t
--ORDER BY CLASSEMENT  
) AS RESULT
WHERE CLASSEMENT BETWEEN 1 AND 8
ORDER BY CLASSEMENT
 
En terme de performance, je ne sais pas si ça change grand chose mais je pense que ça t'évite de calculer 2 fois votes_up - vote_down (j'ai créé une table de test avec vote_p et vote_m à la place).
 
Ma requête gère les égalités, je n'ai pas testé la tienne...
 
Tu peux remplacer le * du SELECT * par les champs que tu veux, ça sera plus propre aussi...
 
Bon courage,

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed