problème de comptage ...

problème de comptage ... - SQL/NoSQL - Programmation

Marsh Posté le 15-10-2007 à 13:38:57    

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

Code :
  1. CREATE TABLE `menu` (
  2.   `menu_id` int(11) NOT NULL auto_increment,
  3.   `menu_semaine` int(9) NOT NULL default '0',
  4.   `menu_jour` varchar(10) NOT NULL default '',
  5.   `menu_entree1` varchar(100) NOT NULL default '',
  6.   `menu_entree2` varchar(100) NOT NULL default '',
  7.   `menu_entree3` varchar(100) NOT NULL default '',
  8.   `menu_entree4` varchar(100) NOT NULL default '',
  9.   `menu_resistance1` varchar(100) NOT NULL default '',
  10.   `menu_resistance2` varchar(100) NOT NULL default '',
  11.   `menu_resistance3` varchar(100) NOT NULL default '',
  12.   `menu_resistance4` varchar(100) NOT NULL default '',
  13.   `menu_resistance5` varchar(100) NOT NULL default '',
  14.   `menu_legume1` varchar(100) NOT NULL default '',
  15.   `menu_legume2` varchar(100) NOT NULL default '',
  16.   `menu_legume3` varchar(100) NOT NULL default '',
  17.   `menu_fromage1` varchar(100) NOT NULL default '',
  18.   `menu_fromage2` varchar(100) NOT NULL default '',
  19.   `menu_fromage3` varchar(100) NOT NULL default '',
  20.   `menu_dessert1` varchar(100) NOT NULL default '',
  21.   `menu_dessert2` varchar(100) NOT NULL default '',
  22.   `menu_dessert3` varchar(100) NOT NULL default '',
  23.   `menu_pc1` varchar(10) NOT NULL default '',
  24.   `menu_pc2` varchar(10) NOT NULL default '',
  25.   `menu_pc3` varchar(10) NOT NULL default '',
  26.   `menu_pc4` varchar(10) NOT NULL default '',
  27.   `menu_pc5` varchar(10) NOT NULL default '',
  28.   `admin_id` varchar(10) NOT NULL default '',
  29.   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 :  
 

Code :
  1. 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`
  2. FROM menu
  3. WHERE `menu_semaine` =42
  4. AND `admin_id` = 'kerlochj'
  5. LIMIT 0 , 30


 
apres cette requete j'obtiens ca http://www.corolle.com/video/test.JPG
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. :)

Reply

Marsh Posté le 15-10-2007 à 13:38:57   

Reply

Marsh Posté le 15-10-2007 à 13:54:36    

Le mieux je pense serait de mettre à jour le nombre de plat dans une nouvelle colonne lorsque tu mets à jour une ligne.
 
Sinon, je pense à un SUM(IF....) avec une requete imbriquée.
 

Reply

Marsh Posté le 15-10-2007 à 13:57:58    

Pas de sum ici.
 
Par contre, des IF et des + :
 
select nom, semaine, jour, if plat1 = '' then 0 else 1 end + if plat2 = '' then 0 else 1 end + ...
from latable

Reply

Marsh Posté le 15-10-2007 à 13:58:17    

le problème c'est que je ne sais pas comment faire pour faire des requete imbriqué..

Reply

Marsh Posté le 15-10-2007 à 13:58:20    

ps : la syntaxe du "if" est ici à titre d'exemple, je ne connais pas la syntaxe sous MySQL.

Reply

Marsh Posté le 15-10-2007 à 14:00:25    

ps² : à noter que le modèle est vraiment TRES bancle.
 
outre les plat1, plat2, etc. que je trouve très moyen, stocker le libellé des plats plutôt qu'un identifiant me semble plus que limite.
 
à mon avis, le mieux c'est de reprendre à 0 la conception de la base, et partir sur un système plus propre. d'autant que ça permettrait aisément de faire un count() au lieu d'une série de if et + qui seront impossible à maintenir.

Reply

Marsh Posté le 15-10-2007 à 14:01:46    

oué mais j'ai fais toute ma gestion de cantine sous ce format la et tout fonctionne maintenant je dois calculer combien de plat ls gens on pris .. voila tout ..

Reply

Marsh Posté le 15-10-2007 à 14:23:07    

Oui mais bon ta conception de base est foireuse .

 

Il aurait fallut faire une colonne "nom du plat" et une colonne "type de plat"(`menu_legume2` , `menu_legume3` , `menu_fromage1` , `menu_fromage2`), et non pas une colonne par type de plat... ce genre de conception amène toujours à des problemes.

 

Un count aurait fait l'affaire apres.


Message édité par Alisteroid le 15-10-2007 à 14:23:50
Reply

Marsh Posté le 15-10-2007 à 14:28:01    

je suis désolé mais je n'ai que ca et je ne vais pas tout refaire... j'ai tout mes page en php5 qui font reference a ca ..  
je dois me débrouillé avec ca ..  
alors s'il vous plait help ... :)

Reply

Marsh Posté le 15-10-2007 à 14:28:31    

genre un gars prend deux fois le même plat (pour une raison X ou Y)
pour les plats, c'est pas très courant et généralement interdit, mais rien n'empêche de bouffer deux yaourts à la fraise


Message édité par MagicBuzz le 15-10-2007 à 14:29:09
Reply

Marsh Posté le 15-10-2007 à 14:28:31   

Reply

Marsh Posté le 15-10-2007 à 14:42:18    

MagicBuzz a écrit :

ps : la syntaxe du "if" est ici à titre d'exemple, je ne connais pas la syntaxe sous MySQL.


case ... when .... ( sql92 powah ;) )

MagicBuzz a écrit :

ps² : à noter que le modèle est vraiment TRES bancle.


+1, d'ailleurs ton exemple de yahourts à la fraise l'illustre parfaitement  [:klem3i1]  
 

Reply

Marsh Posté le 15-10-2007 à 14:43:04    

j'ai un controle dans mon php qui gere ca !!

Reply

Marsh Posté le 15-10-2007 à 14:46:38    

jpkerloch a écrit :

j'ai un controle dans mon php qui gere ca !!


y fait quoi ton contrôle ?
il fait vomir le gars pour qu'il recrache son second yaourt ?

Reply

Marsh Posté le 15-10-2007 à 14:48:45    

non mais serieux, comment je pourrais faire..

Reply

Marsh Posté le 15-10-2007 à 14:53:35    

la proprosition de sebondus n'est pas parfaite, mais permet de résoudre tous tes problèmes d'un coup : rien n'empêche d'avoir X fois un "pat2" rattaché à un même repas, et un bête count() sur les lignes de ta table te permettra de savoir combien de plats ont été mangés dans un repas.
 
niveau code, ça ne devrait pas impliquer énormément de modifications (quelques insert à éclater et autres modifs tout de mêmes)

Reply

Marsh Posté le 15-10-2007 à 15:33:21    

je sais mais comment je pourrais faire concretement , je ne suis mec qui fait des requetes de base .. alors si vous pouviez m'aider ca serai vraiment sympas de votre part ..
Merci

Reply

Marsh Posté le 15-10-2007 à 21:38:47    

on te la dit, ta base de données est pourrie, pas normalisée.  
Alors on te donne une solution pour avoir un truc propre, pas pour faire du marteau burin.  
Maintenant, si personne à envie de t'aider parce que tu n'en fait qu'a ta tête, il faut alors t'en prendre à toi même.  
 
Si tu veux vraiment que ton application soit utilisée, refait ta base de donnée, et modifie tes quelques requêtes pour te calquer sur le nouveau modèle de données. surtout qu'ici tu n'as qu'une table. Donc tes modifs, c'est une histoire d'une petite demi heure.  
 

Reply

Marsh Posté le 16-10-2007 à 08:27:01    

je veux bien modifier mais le probleme c'est que j'ai pas pas grand chose comme notion en sql ni en php. c'est pour ca que j'ai fais comme ca .. croyant que c'etait bien..
mais bon ..

Reply

Marsh Posté le 16-10-2007 à 18:56:20    

si tu décides de repartir sur une bonne base, je suis certains que tu trouveras très facilement de l'aide.  
De plus, modifier ta base ne signifie pas complexifier ton code ni l'sql. ça reste relativement basic et simple.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed