Page 1 sur 2

problème de comptage.

Posté : 15 oct. 2007, 16:47
par cy4nur3
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.

Posté : 15 oct. 2007, 16:59
par iclo
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

Posté : 16 oct. 2007, 08:25
par cy4nur3
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,

Posté : 16 oct. 2007, 08:33
par Tracker
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.

Posté : 16 oct. 2007, 09:04
par cy4nur3
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 :)

Posté : 16 oct. 2007, 09:38
par Tracker
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.

Posté : 16 oct. 2007, 09:48
par cy4nur3
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]

Posté : 16 oct. 2007, 09:49
par cy4nur3
Si j'enleve le "m" il me mets "#1248 - Every derived table must have its own alias "

Posté : 16 oct. 2007, 09:52
par Tracker
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.

Posté : 16 oct. 2007, 09:54
par cy4nur3
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

Posté : 16 oct. 2007, 09:57
par iclo
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...

Posté : 16 oct. 2007, 10:08
par cy4nur3
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,

Posté : 16 oct. 2007, 10:11
par Tracker
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.

Posté : 16 oct. 2007, 10:15
par cy4nur3
vous n'avez pas de solution a me proposer?

Posté : 16 oct. 2007, 10:19
par Tracker
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: