[SQL] Sélectionner l'avant dernière date
Fermé
harry_le_ravi
-
29 juil. 2009 à 17:14
Airmanbzh Messages postés 119 Date d'inscription mardi 28 juillet 2009 Statut Membre Dernière intervention 27 avril 2010 - 30 juil. 2009 à 11:22
Airmanbzh Messages postés 119 Date d'inscription mardi 28 juillet 2009 Statut Membre Dernière intervention 27 avril 2010 - 30 juil. 2009 à 11:22
A voir également:
- Sql dernière date
- Dernière version ccleaner gratuit français - Télécharger - Nettoyage
- Supprimer dernière page word - Guide
- Derniere iphone - Guide
- Publipostage date inversée ✓ - Forum Word
- Passé cette date - Forum Logiciels
9 réponses
Ah oui!
Je n'avais pas étudié le LIMIT.
Ca me semble pas mal du tout.
Je selectionne les valeurs du champ a par ordre de date decroissant et j'affiche que les deux premiers résultats.
Par contre au niveau optimisation ca risque de bouffer pas mal de ressource si je dois séléctionner au préalable toutes les valeurs a de la table?
Je titille un peu quand même c'est juste par curiosité.
Merci.
Je n'avais pas étudié le LIMIT.
Ca me semble pas mal du tout.
Je selectionne les valeurs du champ a par ordre de date decroissant et j'affiche que les deux premiers résultats.
Par contre au niveau optimisation ca risque de bouffer pas mal de ressource si je dois séléctionner au préalable toutes les valeurs a de la table?
Je titille un peu quand même c'est juste par curiosité.
Merci.
On me propose ceci pour la première requête:
SELECT TABLE.a
FROM TABLE
WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE);
Pour la deuxième on me propose ceci:
SELECT TABLE.a
FROM TABLE
WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE WHERE date < (SELECT max(date) FROM TABLE));
SELECT TABLE.a
FROM TABLE
WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE);
Pour la deuxième on me propose ceci:
SELECT TABLE.a
FROM TABLE
WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE WHERE date < (SELECT max(date) FROM TABLE));
Airmanbzh
Messages postés
119
Date d'inscription
mardi 28 juillet 2009
Statut
Membre
Dernière intervention
27 avril 2010
9
30 juil. 2009 à 10:57
30 juil. 2009 à 10:57
Oui, effectivement, je n'avais pas fait attention que c'était un autre champ que le champ date que tu voulais récupérer.
La première m'a l'air correcte. Essaye de tester sans le second select (pour des raisons d'optimisation)
Je ne sais pas si ça marche ou pas de cette façon mais ça vaut le coup d'essayer ;-)
Pour la seconde, il risque d'y avoir une erreure parce que ta requête imbriquée retourne plusieurs résultats
Par contre je viens de penser à quelque chose :
Une requête d'une seule ligne te retourne 2 lignes. La première avec le champ a correspondant à la plus grande date et une seconde avec le champ a correspondant à la date suivante (donc l'avant dernière).
Plus optimisé et moins tordu que toutes celles qu'on a pu proposer ;-).
Et si tu veux 2 requêtes obligatoirement tu peux faire :
La première m'a l'air correcte. Essaye de tester sans le second select (pour des raisons d'optimisation)
SELECT TABLE.a FROM TABLE WHERE TABLE.date = max(TABLE.date);
Je ne sais pas si ça marche ou pas de cette façon mais ça vaut le coup d'essayer ;-)
Pour la seconde, il risque d'y avoir une erreure parce que ta requête imbriquée retourne plusieurs résultats
SELECT TABLE.a FROM TABLE WHERE TABLE.date = (SELECT max(TABLE.date) FROM TABLE WHERE date < (SELECT max(date) FROM TABLE));
Par contre je viens de penser à quelque chose :
SELECT table.a FROM table ORDER BY table.date DESC LIMIT 0,2;
Une requête d'une seule ligne te retourne 2 lignes. La première avec le champ a correspondant à la plus grande date et une seconde avec le champ a correspondant à la date suivante (donc l'avant dernière).
Plus optimisé et moins tordu que toutes celles qu'on a pu proposer ;-).
Et si tu veux 2 requêtes obligatoirement tu peux faire :
// plus grande date SELECT table.a FROM table ORDER BY table.date DESC LIMIT 0,1; //Avant derniere date SELECT table.a FROM table ORDER BY table.date DESC LIMIT 1,1;
Airmanbzh
Messages postés
119
Date d'inscription
mardi 28 juillet 2009
Statut
Membre
Dernière intervention
27 avril 2010
9
30 juil. 2009 à 11:22
30 juil. 2009 à 11:22
En fait, mysql va récupérer tous les lignes de ta table et les trier donc ce sera un algo de complexité "2n" vu l'algorithme de traitement de mysql.
Donc il vaut mieux faire ça que, faire 2 selects dans une même requêtes avec un filtre sur les données.
Pour 5000lignes de données :
Avec ... LIMIT ... : 2n
Requêtes imbriquées : n^2+5000*(le nombre de filtres)
C'est donc un gain de temps et de calculs processeurs.
Donc il vaut mieux faire ça que, faire 2 selects dans une même requêtes avec un filtre sur les données.
Pour 5000lignes de données :
Avec ... LIMIT ... : 2n
Requêtes imbriquées : n^2+5000*(le nombre de filtres)
C'est donc un gain de temps et de calculs processeurs.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
dvphamid
Messages postés
15
Date d'inscription
mercredi 22 juillet 2009
Statut
Membre
Dernière intervention
12 mars 2010
1
29 juil. 2009 à 18:04
29 juil. 2009 à 18:04
bonjour
tu px utilisé deux query
dans le 1er tu prend que les deux premier enregistrement en triant par date croissant
et dans le 2eme tu prend le max date du 1ere query.
ou tu px je pense faire la manipe avec un seul query et tu applique la même chose.
tu px utilisé deux query
dans le 1er tu prend que les deux premier enregistrement en triant par date croissant
et dans le 2eme tu prend le max date du 1ere query.
ou tu px je pense faire la manipe avec un seul query et tu applique la même chose.
dvphamid
Messages postés
15
Date d'inscription
mercredi 22 juillet 2009
Statut
Membre
Dernière intervention
12 mars 2010
1
29 juil. 2009 à 21:17
29 juil. 2009 à 21:17
et ben je suis dsl j ai pas sql sur mon pc mais je vais l installé ce soir si tu vx je px te donner le code transact
Airmanbzh
Messages postés
119
Date d'inscription
mardi 28 juillet 2009
Statut
Membre
Dernière intervention
27 avril 2010
9
30 juil. 2009 à 10:12
30 juil. 2009 à 10:12
Pour la version SQL, j'aurais fait quelques chose comme ça :
Et je pense que tu peux récupérer ton avant dernière date en utilisant une fonction du type :
Explications : tu recupère la date possédant le minimum de jour entre la date maximum et une date Y. La condition te permet de filtrer que la date retournée ne soit pas la date maximum.
J'espère que ça solutionnera ton problème.
Cdt
SELECT MAX(table.date) FROM table
Et je pense que tu peux récupérer ton avant dernière date en utilisant une fonction du type :
SELECT MIN(MAX(table.date) - table.date) FROM table WHERE TO_DAYS(MAX(table.date) - table.date) >0;
Explications : tu recupère la date possédant le minimum de jour entre la date maximum et une date Y. La condition te permet de filtrer que la date retournée ne soit pas la date maximum.
J'espère que ça solutionnera ton problème.
Cdt