problème de comptage.

Eléphanteau du PHP | 29 Messages

15 oct. 2007, 16:47

Bonjour,

Voila je suis coincé dans mon développement, j'ai ma table qui se trouve sous cette forme..

Code : Tout sélectionner

CREATE TABLE `menu` ( `menu_id` int(11) NOT NULL auto_increment, `menu_semaine` int(9) NOT NULL default '0', `menu_jour` varchar(10) NOT NULL default '', `menu_entree1` varchar(100) NOT NULL default '', `menu_entree2` varchar(100) NOT NULL default '', `menu_entree3` varchar(100) NOT NULL default '', `menu_entree4` varchar(100) NOT NULL default '', `menu_resistance1` varchar(100) NOT NULL default '', `menu_resistance2` varchar(100) NOT NULL default '', `menu_resistance3` varchar(100) NOT NULL default '', `menu_resistance4` varchar(100) NOT NULL default '', `menu_resistance5` varchar(100) NOT NULL default '', `menu_legume1` varchar(100) NOT NULL default '', `menu_legume2` varchar(100) NOT NULL default '', `menu_legume3` varchar(100) NOT NULL default '', `menu_fromage1` varchar(100) NOT NULL default '', `menu_fromage2` varchar(100) NOT NULL default '', `menu_fromage3` varchar(100) NOT NULL default '', `menu_dessert1` varchar(100) NOT NULL default '', `menu_dessert2` varchar(100) NOT NULL default '', `menu_dessert3` varchar(100) NOT NULL default '', `menu_pc1` varchar(10) NOT NULL default '', `menu_pc2` varchar(10) NOT NULL default '', `menu_pc3` varchar(10) NOT NULL default '', `menu_pc4` varchar(10) NOT NULL default '', `menu_pc5` varchar(10) NOT NULL default '', `admin_id` varchar(10) NOT NULL default '', PRIMARY KEY (`menu_id`)
Ensuite j'ai tout plein de valeurs dedans. Ce que j'aimerai c'est faire des calculs avec plusieurs requettes.
Je m'explique, j'aimerai avoir le nombre de plat que l'utilisateur "lamba" a pris pour une semaine donnée.

Voici la premiere requette que j'arrive a avoir :
Image

Code : Tout sélectionner

SELECT `admin_id` , `menu_semaine` , `menu_jour` , `menu_entree1` , `menu_entree2` , `menu_entree3` , `menu_entree4` , `menu_resistance1` , `menu_resistance2` , `menu_resistance3` , `menu_resistance4` , `menu_resistance5` , `menu_legume1` , `menu_legume2` , `menu_legume3` , `menu_fromage1` , `menu_fromage2` , `menu_fromage3` , `menu_dessert1` , `menu_dessert2` , `menu_dessert3` FROM menu WHERE `menu_semaine` =42 AND `admin_id` = 'kerlochj' LIMIT 0 , 30
apres cette requete j'obtiens ca

Mais une fois que j'ai cette requette je dois calculer le nombre de plats qu'il a pris:

c'est a dire que je dois obtenir :

Kerlochj | 42 |Lundi | 5
Kerlochj | 42 |Mardi | 5
kerlochj | 42 |Mercredi | 5

Je pense qu'il faut faire une requete imbriquer avec en premier condition la premiere requete et la seconde requete avec du count ou du som mais la probleme c'est que je sais pas trop faire..

Merci de votre aide.

ViPHP
ViPHP | 2144 Messages

15 oct. 2007, 16:59

Salut,

Je pense que la première chose à faire ce serait de revoir la structure de la base de donnée.
Sans vouloir être trop négatif, avec la structure actuelle, tu vas avoir pas mal de problèmes pour exploiter les données.

Tu aurais besoin d'organiser le stockage de ces informations sur plusieures tables:
Une table avec les informations propres aux menu (un menu correspond à un jour donné d'une semaine donnée, si j'ai bien compris ?), une table avec les différents plats, une table avec les différentes parties de menu (menu_entree2, etc) et une table d'association qui composera tes différents menu, en assurant les liens entre les autres tables.

Bonne continuation

Eléphanteau du PHP | 29 Messages

16 oct. 2007, 08:25

Je sais que ma structure n'est pas tip top mais si vous voulez dans ma gestion de cantine il ne me manques pluq que ca !! je n'ai pas été formé pour la programmation et le SQL. J'ai fais comme j'ai pu !! alors si vous vouliez bien m'aider a trouver la solution .. il me me manque plus que ce module a faire et tout est fini .
Merci

Cordialement,

Eléphant du PHP | 443 Messages

16 oct. 2007, 08:33

Salut,

Peux tu dire ce que tu as mis dans les champs vide: '' ou NULL ?

Remarque:
tu ne dois pas échapper te chaines avant de les insérer (on peut lire {carotte d'\}, je pense que ta chaine est incomplète).

Tracker.

Eléphanteau du PHP | 29 Messages

16 oct. 2007, 09:04

les cases sont vides... il n'y a rien dedans !! je fais juste un insert dans la base des champs plein ... das mon formulaire... desolé mais j'ai un niveau assez bas en sql ! ma connaissance me vient d'internet seulement.. merci au tuto :)

Eléphant du PHP | 443 Messages

16 oct. 2007, 09:38

En fait non, ils contiennent '' à cause de ta requête de création:
tous les champs contiennent par défault '', ce qui conplexifie un peu les choses.

Alors essaie ça

Code : Tout sélectionner

select admin_id, menu_semaine, menu_jour, count(menu_entree1)+count(menu_entree2)+count(menu_entree3)+count(menu_entree4)+ count(menu_resistance1)+count(menu_resistance2)+count(menu_resistance3)+count(menu_resistance4)+count(menu_resistance5)+ count(menu_legume1)+count(menu_legume2)+count(menu_legume3)+ count(menu_fromage1)+count(menu_fromage2)+count(menu_fromage3)+ count(menu_dessert1)+count(menu_dessert2)+count(menu_dessert3) as nb_plats from ( select admin_id, menu_semaine, menu_jour, nullif(menu_entree1,'') as menu_entree1, nullif(menu_entree2,'') as menu_entree2, nullif(menu_entree3,'') as menu_entree3, nullif(menu_entree4,'') as menu_entree4, nullif(menu_resistance1,'') as menu_resistance1, nullif(menu_resistance2,'') as menu_resistance2, nullif(menu_resistance3,'') as menu_resistance3, nullif(menu_resistance4,'') as menu_resistance4, nullif(menu_resistance5,'') as menu_resistance5, nullif(menu_legume1,'') as menu_legume1, nullif(menu_legume2,'') as menu_legume2, nullif(menu_legume3,'') as menu_legume3, nullif(menu_fromage1,'') as menu_fromage1, nullif(menu_fromage2,'') as menu_fromage2, nullif(menu_fromage3,'') as menu_fromage3, nullif(menu_dessert1,'') as menu_dessert1, nullif(menu_dessert2,'') as menu_dessert2, nullif(menu_dessert3,'') as menu_dessert3 from menu ) m where admin_id = 'kerlochj' and menu_semaine = '42' group by admin_id, menu_semaine, menu_jour
Tracker.

Eléphanteau du PHP | 29 Messages

16 oct. 2007, 09:48

merci mais cela ne fonctionne pas.. il me mets "#1046 - No database selected" mais dans la seconde requete je vois ..

Code : Tout sélectionner

SELECT admin_id, menu_semaine, menu_jour, nullif( menu_entree1, '' ) AS menu_entree1, nullif( menu_entree2, '' ) AS menu_entree2, nullif( menu_entree3, '' ) AS menu_entree3, nullif( menu_entree4, '' ) AS menu_entree4, nullif( menu_resistance1, '' ) AS menu_resistance1, nullif( menu_resistance2, '' ) AS menu_resistance2, nullif( menu_resistance3, '' ) AS menu_resistance3, nullif( menu_resistance4, '' ) AS menu_resistance4, nullif( menu_resistance5, '' ) AS menu_resistance5, nullif( menu_legume1, '' ) AS menu_legume1, nullif( menu_legume2, '' ) AS menu_legume2, nullif( menu_legume3, '' ) AS menu_legume3, nullif( menu_fromage1, '' ) AS menu_fromage1, nullif( menu_fromage2, '' ) AS menu_fromage2, nullif( menu_fromage3, '' ) AS menu_fromage3, nullif( menu_dessert1, '' ) AS menu_dessert1, nullif( menu_dessert2, '' ) AS menu_dessert2, nullif( menu_dessert3, '' ) AS menu_dessert3 FROM menu )m
que signifie ce "m" ?
Merci[/php]

Eléphanteau du PHP | 29 Messages

16 oct. 2007, 09:49

Si j'enleve le "m" il me mets "#1248 - Every derived table must have its own alias "

Eléphant du PHP | 443 Messages

16 oct. 2007, 09:52

Le m c'est un alias de vue anonyme, ton problème "no database selected" ne provient pas de la requête mais de ton code, tu as dû oublié un mysql_select_db quelque part.

Tu peux, cela dit, ne pas pouvoir exécuter ta requête si ton serveur MySQL ne supporte pas les sous requêtes, alors tiens nous au courant, on doit pouvoir s'en passer.

[edit]
Je passe par un vue anonyme pour recréer la structure que ta table devrait avoir, (c-a-d contenir NULL au lieu de '' quand les champs sont vides, pour dans un second temps pouvoir faire un regroupement. Note au passage, que la requête si tu arrives à l'exécuter, peut te permettre également de connaitre le nombre de plat consommés sur une semaine, ou sur une période (suffit de bricoler le regroupement et les contraintes)

Tracker.
Modifié en dernier par Tracker le 16 oct. 2007, 09:56, modifié 1 fois.

Eléphanteau du PHP | 29 Messages

16 oct. 2007, 09:54

le truc c'est que je l'ai directement executer de phpmyadmin .. si tu me dis que mon Mql est trop vieux je vais le mettre a jour..
Merci et je te tiens au courant

ViPHP
ViPHP | 2144 Messages

16 oct. 2007, 09:57

C'est toi qui voit, et tant mieux si ça fonctionne comme ça.

Mais saches qu'en plus de faire pédaler inutilement le serveur de base de donnée, tu as le risque que si un jour on te demande d'ajouter des fonctionnalités sur l'application, tu risques de te retrouver dans une impasse, avec une base de donnée difficilement modifiable, puisque remplie de donnée.
Alors que sur une structure normalisée, la plus part du temps, un ajout de fonctionnalité se fait sans devoir tout redémonter.

Bonne continuation...

Eléphanteau du PHP | 29 Messages

16 oct. 2007, 10:08

je viens de mettre a jour mon sql, maintenant je suis en 5.0 et j'ai toujours l'erreur.. la requette je l'execute directemetn dans le phpmyadmin..
Pour repondre a ta question iclo je sais que ma base n'est pas tip top mais je n'y conné rien du tout !! tout ce que je sais faire c'est grace a internet .. pas eu de formation .. Merci si vous pouvez m'aider..

Cordialement,

Eléphant du PHP | 443 Messages

16 oct. 2007, 10:11

C'est toi qui voit, et tant mieux si ça fonctionne comme ça.

Mais saches qu'en plus de faire pédaler inutilement le serveur de base de donnée, tu as le risque que si un jour on te demande d'ajouter des fonctionnalités sur l'application, tu risques de te retrouver dans une impasse, avec une base de donnée difficilement modifiable, puisque remplie de donnée.
Alors que sur une structure normalisée, la plus part du temps, un ajout de fonctionnalité se fait sans devoir tout redémonter.

Bonne continuation...
Je suis d'accord avec toi, le design est fondamental. Mais gérer des informations n'est pas à la portée de tout le monde, une structure fiable c'est une chose encore que c'est inaccessible avec un modèle de table MyIsam (pas d'intégrité...), mais l'exploiter logiciellement de façon correcte c'est une autre histoire. Dès lors qu'on ne gère ni lock, ni transaction, on fait forcement n'importe quoi, à croire d'ailleurs que ces principes n'existent pas vue le contenu de quasiment tous les messages postés.

Alors un problème de design, de plus ou de moins, me parrait bien accessoire...

Tracker.

Eléphanteau du PHP | 29 Messages

16 oct. 2007, 10:15

vous n'avez pas de solution a me proposer?

Eléphant du PHP | 443 Messages

16 oct. 2007, 10:19

vous n'avez pas de solution a me proposer?
Le requête que je t'ai posté tourne chez moi avec tes infos sur mon serveur MySQL 5. Donc soit essaie de le faire fonctionner chez toi (au pire en changeant de serveur), soit revois complètement ton schema d'info, mais en débutant tu risques de tomber sur un modèle aussi bancal que le premier.

A toi de voir. :wink: