Problème recherche sur Age

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

07 mai 2009, 17:24

Hello, aller je pause une question

J'ai une table ou je stocke une date de Naissance en trois champs : JourNaissance, MoisNaissance, AnneeNaissance

Mais dans mon formulaire de recherche, je choisie un age ! entre 25 et 45 ans par exemple !

Quelle méthode vous utiliseriez pour faire la recherche ? en sachant qu'un membre qui a eu 25 hier doit ressortir !

J'ai des solutions mais je les trouvent lourdes donc j'aimerai vos avis !

Merci
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

07 mai 2009, 17:49

Quel moteur de base de données utilises-tu ?
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

07 mai 2009, 17:51

Mysql

Pour le moment ma requete donne ca :

Code : Tout sélectionner

SELECT IdProfil FROM tab_profils WHERE (DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(CONCAT(AnneeNaissance,'-',MoisNaissance,'-',JourNaissance))), '%Y')+0)>25 AND (DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(CONCAT(AnneeNaissance,'-',MoisNaissance,'-',JourNaissance))), '%Y')+0)<40
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

Mammouth du PHP | 1339 Messages

08 mai 2009, 00:28

Je proposerai ca (Sans l'avoir testé) :
SELECT IdProfil FROM tab_profils WHERE TIMESTAMPDIFF(YEAR,'".date('Y-m-d')."', CONCAT(AnneeNaissance,'-',MoisNaissance,'-',JourNaissance)) > 25 AND TIMESTAMPDIFF(YEAR,'".date('Y-m-d')."',CONCAT(AnneeNaissance,'-',MoisNaissance,'-',JourNaissance)) < 40
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

08 mai 2009, 10:03

Le plus performant est naturellement de tout restocker dans un champ date et d'utiliser les fonctions de comparaison qui vont bien :).

Toute autre solution sql va impliquer un calcul pour chaque enregistrement et sera naturellement plus lourd... Je te recommande par exemple d'éviter le NOW() et de spécifier la valeur de la date en php (donc en dur dans la requête) pour éviter qu'il ne le recalcul à chaque fois.

Pour limiter les opérations faites par Mysql, je pense que tu dois pouvoir faire une comparaison du genre :
$sql = 'SELECT ...
	WHERE
	  CONCAT(AnneeNaissance,MoisNaissance,JourNaissance) >= '.$dateInf.'
	AND
	  CONCAT(AnneeNaissance,MoisNaissance,JourNaissance) <= '.$dateSup.'
	...';

//Avec 

$dateInf = (date('Y') - 45) . date('md');
$dateSup = (date('Y') - 25) . date('md');
Au final, on ne compare que des chaines et on est pas obligés de tester si la date existe, ça fait toujours ça de moins ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...