[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
Bonjour à tous,

Je suis à la recherche de 2 requetes SQL me permettant de relever :
- la valeur d'un champ a où le champ date est supérieur à toutes les autres
[CODE]Select table.a FROM table WHERE table.date > ALL[/CODE]

- la valeur d'un champ a où le champ date correspond à l'avant dernière date (celle juste avant la précédente requête)


Pourriez vous me dire si la première requête est correcte et la solution de la deuxième.

Merci d'avance.

9 réponses

harry_le_ravi
30 juil. 2009 à 11:09
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.
3
harry_le_ravi
30 juil. 2009 à 10:41
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));
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 à 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)
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;

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
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.
1

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
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.
0
harry_le_ravi
29 juil. 2009 à 19:40
Ca donnerait quoi ce que tu propose en SQL?
0
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
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
0
harry_le_ravi
29 juil. 2009 à 23:40
Je ne sais pas ce que c'est que le code transact mais bon donnez toujours.
0
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
Pour la version SQL, j'aurais fait quelques chose comme ça :
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
0