[Résolu] Requête SQL - doublons oui mais ..

Requête SQL - doublons oui mais .. [Résolu] - SQL/NoSQL - Programmation

Marsh Posté le 25-02-2006 à 00:28:35    

Voila, imaginons une table formé comme ceci
ID | TYPE | VALEUR
1  | X   | 1
2  | Y   | 2
3  | X   | 3
4  | Y   | 4
5  | X   | 5
6  | Y   | 6
 
Je voudrais formuler une requête qui correspondrait à:
"Récupérer les 2 dernières valeurs de chaque type"
 
En gros, un 'SELECT DISTINCT type' couplé à un 'SELECT [...] WHERE type=type LIMIT 0,2'
Je sais que GROUP BY permet de recuperer les doublons, ça se rapproche de ce que je veux mais c'est pas ça
 
Pour l'instant, je recupère les types par un SELECT DISTINCT et je fais un SELECT [...] LIMIT 0,2 par derrière, mais sur 83000 enregistrements et 25 types, cela prend ennormément de temps (+ de 1 minute)
 
Si vous avez une idée .. merci d'avance :)


Message édité par debh le 25-02-2006 à 22:00:42
Reply

Marsh Posté le 25-02-2006 à 00:28:35   

Reply

Marsh Posté le 25-02-2006 à 20:47:39    

Tu peux faire des sous-requêtes ?
 
En gros il te faut les 2 valeurs les plus grandes de chaque type ?
 

Code :
  1. SELECT mt1.type, MAX(mt1.valeur), MAX(mt2.max_valeur)
  2. FROM maTable mt1,
  3.      (SELECT type, MAX(valeur) AS max_valeur
  4.      FROM maTable
  5.      GROUP BY type) mt2
  6. WHERE mt1.type = mt2.type
  7. AND mt1.valeur < mt2.max_valeur
  8. GROUP BY mt1.type;

Reply

Marsh Posté le 25-02-2006 à 21:03:01    

Cette requête n'a pas l'air de marcher, et j'avoue que sa logique me depasse un peu :P
La problematique que je pose, a l'air de poser problème !
Est-t'il possible de faire ce que je demande en une seule requête ?
Si les gens qui passeront par ici veulent bien nous éclairer de leur connaissance :)
 
 
Je donne pour tester ma table complété
 

Code :
  1. CREATE TABLE `matable` (
  2.   `id` int(11) NOT NULL auto_increment,
  3.   `type` varchar(1) NOT NULL,
  4.   `valeur` int(11) NOT NULL,
  5.   PRIMARY KEY  (`id`)
  6. );
  7. INSERT INTO `matable` VALUES (1, 'X', 1);
  8. INSERT INTO `matable` VALUES (2, 'Y', 2);
  9. INSERT INTO `matable` VALUES (3, 'X', 3);
  10. INSERT INTO `matable` VALUES (4, 'Y', 4);
  11. INSERT INTO `matable` VALUES (5, 'X', 5);
  12. INSERT INTO `matable` VALUES (6, 'Y', 6);
  13. INSERT INTO `matable` VALUES (7, 'X', 7);
  14. INSERT INTO `matable` VALUES (8, 'Y', 8);


 
Merci de ta réponse !

Reply

Marsh Posté le 25-02-2006 à 21:55:42    

Tu utilises mySql ? Quelle version ?
 
Je pense que ma requête marche, sauf sur les anciennes versions de mySql qui n'acceptent pas les sous-requêtes.

Reply

Marsh Posté le 25-02-2006 à 22:00:17    

En effet, autant pour moi, j'avais mal copier/collé !

Reply

Marsh Posté le 25-02-2006 à 22:24:45    

Résultat, ça marche ou pas ? :)

Reply

Marsh Posté le 25-02-2006 à 22:25:31    

Cela marche, maintenant je cherche à faire la même chose avec les 5 derniers resultats
tu as peut être une idée ? :p


Message édité par debh le 25-02-2006 à 22:25:47
Reply

Marsh Posté le 26-02-2006 à 00:28:36    

on verra ça demain, bonne nuit :D

Reply

Marsh Posté le 26-02-2006 à 00:31:08    

bonne nuit :)

Reply

Marsh Posté le 26-02-2006 à 09:39:59    

S'il n'y a que 25 types différents, alors il vaut mieux repartir sur ta solution initiale si tu veux les 5 plus grandes valeurs par type.
 
Mets un index sur type si ce n'est pas déjà fait, et ça devrait pas prendre plus de quelques secondes ...

Reply

Sujets relatifs:

Leave a Replay

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