petit-ourson
samedi 15 mars 2008 à 15:24
Bon ça restera peut être juste un cas d'école...
Soit la table :
CODE
mysql> select * from danseurs
+-----------+------+--------+
| idDanseur | nom | points |
+-----------+------+--------+
| 1 | Toto | 10 |
| 2 | Tata | 100 |
| 3 | Titi | 50 |
| 4 | Tutu | 20 |
| 5 | Tete | 50 |
+-----------+------+--------+
Soit la procédure stockée :
CODE
CREATE PROCEDURE Classement()
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE var_id INT;
DECLARE var_nom VARCHAR(100);
DECLARE var_points INT;
DECLARE var_position INT DEFAULT 0;
DECLARE var_numero INT DEFAULT 0;
DECLARE var_pointprecedent INT DEFAULT NULL;
DECLARE done INT DEFAULT 0;
DECLARE curseur1 CURSOR FOR SELECT * FROM danseurs ORDER BY points DESC;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
DROP TEMPORARY TABLE IF EXISTS TempDanseurs;
CREATE TEMPORARY TABLE TempDanseurs (
idDanseur INT NOT NULL PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
points INT NOT NULL,
position INT NOT NULL
) ENGINE=MEMORY;
OPEN curseur1; # ouverture du curseur1
REPEAT
FETCH curseur1 INTO var_id, var_nom, var_points;
IF done = 0 THEN
SET var_numero := var_numero + 1;
IF( var_pointprecedent IS NULL OR var_points < var_pointprecedent) THEN
SET var_position := var_numero;
END IF;
SET var_pointprecedent := var_points;
INSERT INTO TempDanseurs(idDanseur, nom, points, position) VALUES (var_id, var_nom, var_points, var_position);
END IF;
UNTIL done
END REPEAT;
CLOSE curseur1; # fermeture du curseur1
SELECT * FROM TempDanseurs ORDER BY position;
END|
Le résultat :
CODE
mysql> CALL Classement();
+-----------+------+--------+----------+
| idDanseur | nom | points | position |
+-----------+------+--------+----------+
| 2 | Tata | 100 | 1 |
| 5 | Tete | 50 | 2 |
| 3 | Titi | 50 | 2 |
| 4 | Tutu | 20 | 4 |
| 1 | Toto | 10 | 5 |
+-----------+------+--------+----------+
Si quelqu'un me trouve comment me passer de la table temporaire... Je n'ai pas trouvé.