Requete SQL, année en cours

Résolu
doudoupe Messages postés 85 Date d'inscription   Statut Membre Dernière intervention   -  
doudoupe Messages postés 85 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour tout le monde!

Petite question concernant les dates en SQL.
J'ai une base de donnée contenant une table 'users' avec un champs (parmi d'autres) reg_date (=registration date). Certains users se sont inscrit en 2009 (par ex) et d'autres en 2010, cette année.

J'ai un script php qui se connecte à ma base de donnée via PDO et une requete SQL (parmi d'autres) qui doit compter le nombre de users s'étant inscrits cette année (l'année en cours) et ne pas prendre en compte les users inscrits les autres années.

Attention: Si l'année en cours est 2011, je souhaite compter le nombre de users inscrits en 2011 (logique).

J'ai donc penser à ça:

$currentY = date("Y-01-01");  
$data_nbUserYear = $bdd->query('SELECT COUNT(*) FROM users WHERE reg_date>'.$currentY.';');  
$nbUserYear = $data_nbUserYear->fetch();  


nb: dans la bdd, les date sont de format Y-m-d

Forcement, ça aurait été trop facile! :D
Le résultat m'affiche le nombre de users quelque soit l'année (comme si je n'avais pas mis de condition WHERE)
Avez-vous une solution ?

Merci pour vos réponses!
doudoupe

edit: clarification! :)

5 réponses

Templier Nocturne Messages postés 7734 Date d'inscription   Statut Membre Dernière intervention   1 106
 
tu as beaucoup de méthodes possibles ^^

1) une table par années : tu regarde l'année, tu regarde si la table correspondante existe, sinon tu la crée

2) une table globale : tu regarde l'année, tu compte le visiteur dans la ligne où l'année est celle qu'il faut

un dessin :

| ID | année | visiteurs |
| 1 | 2010 | 150 |
| 2 | 2011 | 123 |
| 3 | 2012 | 145 |

aprés ça sert à rien, c'est la fin du monde XD


pour te simplifier la vie, tu peux créer directement plusieurs années de suite ;)

ce sont les deux qui me viennent tout de suite à l'esprit, mais il y en a d'autre ;)
0
doudoupe Messages postés 85 Date d'inscription   Statut Membre Dernière intervention   68
 
Avant tout, merci de te pencher sur mon post! :)

Je ne peux pas me permettre de créer de table en plus. La BDD étant déja conséquente.
Je cherche simplement à parcourir ma table 'user' existante, si l'année d'inscription est la meme que l'année en cours alors je le prend en compte, sinon je passe à l'entrée (user) suivante.


Je peux certainement faire cela simplement avec un WHERE comme dans mon bout de code, sans avoir à créer une table en plus... Je trouve que ça alourdi la base pour très peu, non?

Il s'agit juste de faire des statistiques concernant mes users. L'affichage du résultat de la requête est géré ensuite par du php.
0
Templier Nocturne Messages postés 7734 Date d'inscription   Statut Membre Dernière intervention   1 106
 
$req = "SELECT * FROM inscrits WHERE année=2010";

$nbr = exec($req);

$tot = sizeof($nbr);

ça devrais marcher :)
0
doudoupe Messages postés 85 Date d'inscription   Statut Membre Dernière intervention   68
 
Alors oui ça pourrait marcher si j'avais un champs 'année' en plus du champs 'reg_date', chose que je souhaite éviter.
De plus, cette méthode semble encore un peu lourde (selection de tous les champs puis les compter avec sizeof()). ^^ (désolé je suis chiant!)

Bref, toujours est-il que tu m'as donné un début de solution! ;)
Ce qui m'a conduit à une recherche fructueuse, puisque j'ai trouvé ce que je cherchais!

Voici donc la solution qui je pense est la bonne, et la plus légère.

$currentY = date('Y');
$data_nbUserYear = $bdd->query('SELECT COUNT(*) FROM users WHERE year(reg_date) = '.$currentY.';');
$nbUserYear = $data_nbUserYear->fetch();
0
doudoupe Messages postés 85 Date d'inscription   Statut Membre Dernière intervention   68
 
solution qui fonctionne je précise! ^^
0
Templier Nocturne Messages postés 7734 Date d'inscription   Statut Membre Dernière intervention   1 106
 
je ne pense pas pouvoir t'aider plus compte tenu de mon niveau ^^

moi je pense mes site entièrement dés le début, puis le jour ou je me rend compte que j'ai oublié un truc, je bricole ^^ si ça marche tant mieux, sinon, je pleure XD

je suis loin du "c'est peut être un peu lourd" :P

d'ailleur, je ne comprend pas bien, au final, tu n'éxecute le script qu'une fois si c'est pour compter le nombre d'inscriptions à l'année...
0
doudoupe Messages postés 85 Date d'inscription   Statut Membre Dernière intervention   68
 
J'explique rapidement:
Je crée une page d'administration de ma bdd en php, cad ajout de donnée, lecture de données et statistiques.
Par exemple j'ai un petit cadre sur la page d'accueil qui affiche entre autre le nombre total d'utilisateurs enregistrés, le nombre d'utilisateur enregistré depuis le debut de l'année... Et donc ce petit script est exécuter à chaque fois qu'on va sur la page d'admin.
Comme un utilisateur peut-être créer (et supprimé) n'importe quand, cette valeur changera souvent. Qu'on soit le 15 Janvier 2010, ou le 15 decembre 2010, je souhaite afficher le nombre d'utilisateurs crées depuis le 1er janvier 2010.
Ce n'est que pour avoir des statistiques que je souhaite faire ça. :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Templier Nocturne Messages postés 7734 Date d'inscription   Statut Membre Dernière intervention   1 106
 
currentY = date('Y');
$data_nbUserYear = $bdd->query('SELECT * FROM users WHERE year(reg_date) = '.$currentY.';');
$nbUserYear = sizeof($data_nbUserYear);

ça marche pas ça ? au final, c'est aussi lourd que le tien...
0
doudoupe Messages postés 85 Date d'inscription   Statut Membre Dernière intervention   68
 
Si ça devrait fonctionner aussi ça.
Mais ton SELECT * sélectionne TOUS les champs (une 15aine pour ma part) de la table users (où l'année correspond) et les stocke en mémoire, puis stocke INT.
En utilisant SELECT COUNT(*) tu ne stockes qu'on INT en mémoire.

Dans une base avec plusieurs centaines de nouveaux users par an, ça me semble bien plut léger! Tu ne crois pas?
0
Templier Nocturne Messages postés 7734 Date d'inscription   Statut Membre Dernière intervention   1 106
 
bon... ben si tu en as une toute petite (de mémoire hein, je ne sais pas ce que tu vas pensser là... :P)

$currentY = date('Y');
$req = "SELECT COUNT(*) FROM table";
$tot = exec($req);
$temp = 0;
$nbr = 0;
while( $temp < $tot)
{

$req = "SELECT year(reg_date) FROM users WHERE ID = $temp ;";
$temp = $temp + 1;
$xtmp = exec($req);
if($xtmp = $currentY);
{
$nbr = $nbr + 1;
}
}
echo $nbr;



ça, ça a toutes les chances de marché si je me suis pas trompé sans la syntaxe...

le seul problème c'est la boucle...

mais au moins, t'utilise trés peu de mémoire
0
doudoupe Messages postés 85 Date d'inscription   Statut Membre Dernière intervention   68
 
Et là c'est on processeur qui travaille beaucoup plus! (même si c'est tout à fait négligeable avec les proc d'aujourd'hui!)
Mais c'est un peu tirer par les cheveux tout de même! ^^
Pourquoi faire compliqué quand on peut faire simple ? :p
0
Templier Nocturne Messages postés 7734 Date d'inscription   Statut Membre Dernière intervention   1 106
 
parce qu'a priori, le simple ne veut pas fonctionner ^^

tu veux aller du point A au point B, mais le pont sur le chemin est détruit... ben tu fait un détours ^^
0
doudoupe Messages postés 85 Date d'inscription   Statut Membre Dernière intervention   68
 
Sisi pour moi ça fonctionne très bien! :)
Il ne me manquait que la fonction sql year() qui a réglé mon problème! ;)
0