Version complète: sur le forum Webmaster Hub : Date la plus récente...
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > SQL
ZuckBin
Bonjour,

Après plusieurs heures, je me résigne à venir chercher de l'aide...

Je souhaite sélectionner la date la plus récente dans une colonne DATE, par rapport à un ID identique unique.

Voici la requête:

CODE
SELECT DISTINCT RECORD, END_DATE
FROM log_cb
WHERE END_DATE < CURDATE( )
AND END_DATE = ( max( `END_DATE` ) ) AS maxdate
GROUP BY maxdate
ORDER BY END_DATE DESC



Voici les données:

CODE
END_DATE        RECORD
2008-09-05       171
2008-09-01       171
2008-09-18       171
2008-07-03       170


Donc je souhaite obtenir ceci:

CODE
END_DATE        RECORD
2008-09-18       171
2008-07-03       170


Merci de votre aide,
Cordialement.
Dan
En rajoutant un simple "limit 1", non ?
Kioob
Hello,

CODE
select max( end_date ) as maxDate from log_cb where record = 171


non ?
ZuckBin
En faite non, cela ne convient pas de faire un "LIMIT 1", je m'étais mal expliqué, je veux garder les autres ID.

De plus, j'ai cette erreur:

CODE
Invalid use of group function
Kioob
Si tu veux tous les ID, dans ce cas ce serait :
CODE
select record, max( end_date ) as maxDate
from log_cb
group by record
ZuckBin
J'ai fait ca:

CODE
SELECT RECORD, MAX(END_DATE) AS maxdate FROM log_cb WHERE END_DATE < CURDATE() GROUP BY RECORD


Mais les dates ne sont pas du tout affichées.
ZuckBin
J'ai résolu mon problème ainsi:

CODE
SELECT DISTINCT RECORD, MAX(END_DATE) AS maxdate FROM log_cb WHERE END_DATE < CURDATE() GROUP BY RECORD ORDER BY maxdate


Bye wink.gif
Kioob
Le "DISTINCT" ne sert à rien ici vu que tu as déjà un "GROUP BY".

Et du coup ormis le "ORDER" la requête est la même qu'avant...
ZuckBin
Bonjour,

En faite, je croyais mon problème résolu, mais pas du tout.

Voici la requête:

CODE
SELECT RECORD, MAX(END_DATE) AS maxdate FROM log_cb WHERE END_DATE < CURDATE() GROUP BY RECORD ORDER BY maxdate


Voici les résultats

CODE
RECORD     maxdate
140     2008-10-04
168     2008-10-05


Qu'alors voici les données réelles:

CODE
END_DATE     RECORD
2008-10-04      140
2008-11-04     140
2008-10-05      168
2008-11-05     168


Le résultat attendu est ceci:

CODE
END_DATE     RECORD
2008-11-04     140
2008-11-05     168


Merci de votre aide,
Cordialement
captain_torche
Il va falloir que tu enlèves la condition WHERE END_DATE < CURDATE(), alors.
Aujourd'hui, CURDATE() vaut 2008-10-08. Ta requête ne peux ressortir que des résultats inférieurs à cette date.
ZuckBin
En faite, je suis plus sur d'avoir pris le problème dans le bon sens.

Je vais re expliquer pour que l'on puisse y voir clair.



J'ai un prestataire qui m'envoie des infos tout les jours via un webservice, passage de variables via un url.

Je récupère les infos et je les insèrent dans ma base de donné log_cb, d'où les enregistrements:END_DATE qui est la fin d'un abonnement, et RECORD qui est un identifiant unique pour mes membres.

Je souhaite exécuter un script quotidien via cron qui va vérifier si END_DATE < à la date du jour: si c'est le cas, je met à jour mes enregistrements et je met fin à l'abonnement.

Dans le cas contraire, on ne fais rien.

Voila smile.gif
tellaw
Tu considères un abo terminé quand la end-date la plus grande d'un reccord est plus petite que la date du jour ?
ZuckBin
Oui, chaque RECORD est associé à X dates.

Je ne veux retenir que la plus grande des END_DATES par RECORD
Kioob
J'ai juste survolé, mais à priori ce qu'il te faut c'est remplacer ton WHERE par un HAVING maxdate < curdate() (à placer après le group by)
tellaw
Oui, regarde la page suivante, c'est probablement un bonne piste :

http://sql.1keydata.com/fr/sql-having.php

SELECT RECORD, END_DATE FROM log_cb GROUP BY RECORD HAVING max(END_DATE) < CURDATE()

ca donne quoi ca ?
ZuckBin
CODE
SELECT RECORD, END_DATE FROM log_cb GROUP BY RECORD HAVING max(END_DATE) < CURDATE()


Bingo !

Ca fonctionne...

Merci pour votre aide wink.gif

Résolu....
Kioob
malheureux, remplace ton end_date par un max(end_date), sinon tu vas avoir de bien mauvaises surprises... Là MySQL te retourne un end_date "au hasard" parmi tous ceux possibles.
ZuckBin
C'est corrigé, merci Kioob wink.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.