ZuckBin Posté 23 Septembre 2008 Posté 23 Septembre 2008 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: SELECT DISTINCT RECORD, END_DATEFROM log_cbWHERE END_DATE < CURDATE( )AND END_DATE = ( max( `END_DATE` ) ) AS maxdateGROUP BY maxdateORDER BY END_DATE DESC Voici les données: END_DATE RECORD2008-09-05 1712008-09-01 1712008-09-18 1712008-07-03 170 Donc je souhaite obtenir ceci: END_DATE RECORD2008-09-18 1712008-07-03 170 Merci de votre aide, Cordialement.
Kioob Posté 23 Septembre 2008 Posté 23 Septembre 2008 Hello, select max( end_date ) as maxDate from log_cb where record = 171 non ?
ZuckBin Posté 23 Septembre 2008 Auteur Posté 23 Septembre 2008 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: Invalid use of group function
Kioob Posté 23 Septembre 2008 Posté 23 Septembre 2008 Si tu veux tous les ID, dans ce cas ce serait : select record, max( end_date ) as maxDatefrom log_cbgroup by record
ZuckBin Posté 23 Septembre 2008 Auteur Posté 23 Septembre 2008 J'ai fait ca: 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 Posté 25 Septembre 2008 Auteur Posté 25 Septembre 2008 J'ai résolu mon problème ainsi: SELECT DISTINCT RECORD, MAX(END_DATE) AS maxdate FROM log_cb WHERE END_DATE < CURDATE() GROUP BY RECORD ORDER BY maxdate Bye
Kioob Posté 25 Septembre 2008 Posté 25 Septembre 2008 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 Posté 8 Octobre 2008 Auteur Posté 8 Octobre 2008 Bonjour, En faite, je croyais mon problème résolu, mais pas du tout. Voici la requête: SELECT RECORD, MAX(END_DATE) AS maxdate FROM log_cb WHERE END_DATE < CURDATE() GROUP BY RECORD ORDER BY maxdate Voici les résultats RECORD maxdate140 2008-10-04168 2008-10-05 Qu'alors voici les données réelles: END_DATE RECORD2008-10-04 1402008-11-04 1402008-10-05 1682008-11-05 168 Le résultat attendu est ceci: END_DATE RECORD2008-11-04 1402008-11-05 168 Merci de votre aide, Cordialement
captain_torche Posté 8 Octobre 2008 Posté 8 Octobre 2008 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 Posté 8 Octobre 2008 Auteur Posté 8 Octobre 2008 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
tellaw Posté 8 Octobre 2008 Posté 8 Octobre 2008 (modifié) Tu considères un abo terminé quand la end-date la plus grande d'un reccord est plus petite que la date du jour ? Modifié 8 Octobre 2008 par tellaw
ZuckBin Posté 8 Octobre 2008 Auteur Posté 8 Octobre 2008 (modifié) Oui, chaque RECORD est associé à X dates. Je ne veux retenir que la plus grande des END_DATES par RECORD Modifié 8 Octobre 2008 par ZuckBin
Kioob Posté 8 Octobre 2008 Posté 8 Octobre 2008 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 Posté 8 Octobre 2008 Posté 8 Octobre 2008 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 Posté 8 Octobre 2008 Auteur Posté 8 Octobre 2008 (modifié) SELECT RECORD, END_DATE FROM log_cb GROUP BY RECORD HAVING max(END_DATE) < CURDATE() Bingo ! Ca fonctionne... Merci pour votre aide Résolu.... Modifié 8 Octobre 2008 par ZuckBin
Kioob Posté 8 Octobre 2008 Posté 8 Octobre 2008 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.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant