Jouons à l’école avec un petit cas concret ;)
Une association sportive gère ses membres via un outil en ligne écrit en PHP / MySQL. Les dirigeants de l’association souhaitent adresser un mailing à tous les membres majeurs à ce jour.
Sélectionner les membres majeursLa table “membres” contient différents champs mais nous nous intéresserons ici uniquement à deux d’entre eux : membre_id (un entier auto-incrémenté et clé primaire) et membre_naissance (un champ au format DATE contenant la date de naissance du membre).
Question : Comment sélectionner uniquement les ID des fiches des membres majeurs à ce jour ?
Il existe plusieurs méthodes, en voici une 100% MySQL.
-
SELECT `membre_id`, `membre_naissance` FROM `membres` WHERE YEAR( CURRENT_DATE( ) ) - YEAR( `membre_naissance` ) - ( RIGHT( CURRENT_DATE( ) , 5 ) < RIGHT( `membre_naissance` , 5 ) ) > 17;
Analysons cette requête
A priori, aucun problème pour vous sur la première partie :
-
SELECT `membre_id`, `membre_naissance` FROM `membres`
En effet, nous sélectionnons ici les deux champs qui nous intéressent dans la table membres.
Ne partez pas déjà, la difficulté arrive :
-
WHERE YEAR( CURRENT_DATE( ) ) - YEAR( `membre_naissance` )
Ici, nous prenons l’année (YEAR) de la date actuelle (CURRENT_DATE) à laquelle nous soustrayons l’année de la date de naissance.
Note : nous employons CURRENT_DATE() plutôt que NOW() car celle-ci retourne une date au format YYYY-MM-DD alors que
NOW() retourne une date sous la forme YYYY-MM-DD HH:MM:SS
Cette soustraction va calculer le nombre d’années entre l’année actuelle et l’année de naissance. Mais elle ne va pas donner un âge juste car elle retournera une année de trop pour ceux qui sont nés à partir de demain.
Nous rajoutons donc :
-
- ( RIGHT( CURRENT_DATE( ) , 5 ) < RIGHT( `membre_naissance` , 5 ) )
Ici, nous soustrayons donc le résultat d’un… test.
Ce test consiste à vérifier si la portion “mois-jour” (les 5 derniers caractères) de la date courante (par exemple 04-20 pour 2008-04-20) est inférieure à la portion “mois-jour” de la date de naissance.
Si le test est positif, il retournera 1. S’il est négatif, il retournera 0. Et c’est ce résultat de test soustrait à la différence entre les années qui donnera l’âge réel.
Le dernier morceau de la requête :
-
> 17
Il permet tout simplement de voir si le résultat du calcul donne un chiffre supérieur à 17 (la majorité en France étant fixée à 18 ans).
En changeant cette valeur, on peut également trouver tous les membres mineurs (< 18) ou tous les membres ayant un âge précis (= 30 pour trouver tous les membres de 30 ans).
Voilà. Il existe bien d’autres solutions, en passant par exemple par des timestamps. Mais celle-ci, lorsqu’on a bien compris son principe, a le mérite d’être simple et facilement adaptable.
Des suggestions ?
Inscrivez-vous au RSS des commentaires ou laissez un trackback
Sélection par âge



















Donnez votre avis
Veuillez laisser votre commentaire ci-dessous