Je n'ai besoin que de l'année pour faire ma requête

Mammouth du PHP | 545 Messages

24 oct. 2007, 18:44

Bonjour,

Je recherche la méthode pour faire une requête en fonction de l'année hors que le champs comporte un élément date de type '0000-00-00'.

J'ai essayé ceci:
$course = "SELECT id, course, date as days, pat_chal, lieu, kilometrage, nbre_part, epreuve_id"
	. "\n FROM #__classement_course"
	. "\n WHERE days = '2004'"
	. "\n ORDER BY days ASC"
	;
$database->setQuery( $course );
$courselist = $database->loadObjectList();
sans résultat !
Je me demande si c'est la bonne méthode ou alors s'il faut faire ma liste de course tant que la date soit comprise dans l'année 2004:
if (2004 <= $days < 2004 +1) {
echo 'Ce que j\'ai envie !';}
Que me conseillez-vous ?

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 oct. 2007, 19:01

Il existe 2 méthodes :

1/ Encadrer l'année

Code : Tout sélectionner

SELECT liste, des, champs FROM maTable WHERE day >= STR_TO_DATE('2004-01-01', '%Y-%m-%d') AND day < STR_TO_DATE('2005-01-01', '%Y-%m-%d')
De loin la solution que je préfère puisqu'aucune opération n'étant réalisée sur la colonne 'day', les éventuels indexs peuvent fonctionner.
La contrainte étant qu'il faut trouver le 1er jour de l'année et le 1er jour de l'année +1 en PHP

2/ Travailler sur une section du champ

Code : Tout sélectionner

SELECT liste, des, champs FROM maTable WHERE YEAR(day) = 2004
Plus simple à écrire mais extrêmement plus couteuse pour le SGBD. En effet, le fait d'appliquer une fonction sur un champ de la table oblige le SGBD à appliquer cette fonction sur chaque enregistrement avant de trier le résultat, ce qui empêche donc toute utilisation d'index sur cette colonne
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

24 oct. 2007, 19:19

Que me conseillez-vous ?
De poster le schéma de ta table :(

Mammouth du PHP | 545 Messages

24 oct. 2007, 20:20

Salut et merci pour vos réponses,
1/ Encadrer l'année
En faite, je récupère l'année dans une variable ($annee) via un formulaire que l'utilisateur sélectionne.
Il suffirait de faire un truc du style
$anneemin = $annee . '-01-01';
$anneemax = ($annee + 1) . '-01-01';

SELECT
  liste, des, champs
FROM
  maTable
WHERE
  day >= STR_TO_DATE($anneemin, '%Y-%m-%d')
  AND day < STR_TO_DATE($anneemax, '%Y-%m-%d')
Est-ce que cela pourrait fonctionner ainsi ?
De poster le schéma de ta table :(
Voici le schéma de la table en question:
CREATE TABLE IF NOT EXISTS `jos_classement_course` (
	`id` INT NOT NULL AUTO_INCREMENT,
	`course` VARCHAR(45) NOT NULL,
	`date` DATE NOT NULL,
	`pat_chal` ENUM ('C','P','H') NOT NULL,
	`lieu` VARCHAR(45) NOT NULL,
	`kilometrage` FLOAT(5,3) NOT NULL,
	`nbre_part` INT(11) NOT NULL,
	`epreuve_id` INT(11) NOT NULL default '0',
	PRIMARY KEY(`id`)
	) TYPE=MyISAM;
Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

24 oct. 2007, 20:54

Je vois que tu n'utilises pas d'index sur ton champ "date", si tu as beaucoup d'enregistrements (100+) il te faudrait en créer un.

Pour le reste, attention à ne pas confondre SQL et PHP. En PHP, la requête n'est qu'une chaîne de caractères. Tu construis ta chaîne de caractère et quand tu as fini, tu donnes le tout à mysql_query() ou tout autre fonction. Si tu n'es pas sûr de ce que tu fais, insère un truc pour lire la requête juste avant d'être exécutée, par exemple
die($course);
...tu ne devrais pas voir de variables PHP dans la requête finale.

Sinon, concernant les dates, je préfèrerais utiliser LIKE, qui devrait marcher au moins aussi que les autres techniques.
$sql = "SELECT *
        FROM #__classement_course
        WHERE days LIKE '" . $annee . "-%' 
        ORDER BY days ASC";