Requête SQL - Position dans un classement - SQL/NoSQL - Programmation
Marsh Posté le 04-04-2012 à 09:51:15
Avec quelle base de données (Oracle, MySQL, ...) ?
Avec Oracle, la solution serait Select rownum, ...
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
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.
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 :-)
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.
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)
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
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).
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,
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
Message édité par luckylp56 le 04-04-2012 à 10:41:57