calcul résultat requête

GYo
Eléphanteau du PHP | 11 Messages

17 mars 2009, 13:57

Bonjour,

Voila j’ai un petit souci pour additionner le résultat d’une requête.

Voila ma requête

"SELECT * FROM table WHERE activité = 'sav' ”

Cette requête va m’afficher tout les SAV sur mes 8 zone ( zoneA, zoneB, zoneC….) qui ont chacune des sous zones (z1, z2….). Avec la fonction mysql_fetch_array j’affiche le tout ce qui me donne

Zone A z1 00x00x0x00
Zone A z2 00x00x0x00
Zone A z3 01x11x00x11
Zone A z4 00x10x00x01
Zone A z5 00x10x00x01
Zone A z3 10x01x11x00
Zone A z2 00x00x0x00
Zone A z2 10x01x11x00
Zone B za 00x00x0x00
Zone B zb 01x11x00x11
Zone B zc 10x01x11x00
Zone B zd 00x00x0x00
Zone B zf 10x01x11x00
Zone B zk 01x11x00x11
Zone B zk 00x00x0x00
Zone B zl 01x11x00x11
Zone B zm 00x00x0x00
Zone B zj 00x00x0x00


Je cherche à calculer le nombre de 0 pour les zone A et B en additionnant toute les sous zones. Donc j’ai ma fonction :

$nb0 = substr_count(nom de la colonne de la chaine, '0'); //compte le nombre de 0

$adi += $nb0; //fait un total du nombre de demi heure

Le résultat que je souhaite obtenir est pour la zone A : 44 et pour la zone B : 50

A la place j’obtient 94 puisqu’il m’additionne tout sans prendre en compte la zone.

Vous allez me dire il suffit de mettre dans la requête WHERE zone = ’zoneA’ et j’en arrive a mon problème.

En effet le nom de mes zones peut changer du jours au lendemain donc je ne peut rien écrire en « dur ». Ma question est comment séparer le résultat de A et de B ?

merci

Eléphant du PHP | 145 Messages

17 mars 2009, 14:19

Salut,

Je pense que ce mot clé peux t'aider à construire ta requête : GROUPE BY

http://sqlpro.developpez.com/cours/sqlaz/ensembles/

Tu aura une requete du type :

Code : Tout sélectionner

Select Zone, champ1, champ2... FROM table WHERE activite = "sav" GROUP BY Zone;
Edit :
Ou alors tu fais un systeme pas très propre à mon gout mais qui pourrait t'aider :
<?php
$requete = "Select * FROM table WHERE activite = 'sav'";
$query = mysql_query($requete) or die(mysql_error());
$res = mysql_fetch_array($query);
$zone = $res['Zone'];
$nb0[$zone] =  substr_count(nom de la colonne de la chaine, '0');
while($res = mysql_fetch_array($query)){
      if($res['Zone'] != $zone){
      $zone = $res['Zone'];
      $nb0[$zone] =  substr_count(nom de la colonne de la chaine, '0');
      }
      else {
      $nb0[$zone] += substr_count(nom de la colonne de la chaine, '0');
      $zone = $res['Zone'];
      }
}

$nb_sql = "SELECT DISTINC Zone FROM table WHERE activite = 'sav'";
$nb_query = mysql_query($nb_sql) or die(mysql_error());
while($nb = mysql_fetch_array($nb_query)){
$zone = $nb['Zone'];
echo $zone.' = '.$nb0[$zone].'<br />';
}
?>
Voila, il peut contenir des erreurs vis à vis qu'il manque plein d'informations concernant la table et du faite que je l'ai fais à la va vite mais je pense que ça peux t'aider ;)

Albat90 ;)
La culture, c'est comme la confiture, moins on en a, plus on l'étale.

GYo
Eléphanteau du PHP | 11 Messages

18 mars 2009, 16:59

Merci infiniment, ta première solution ma grandement aider mais pour autre chose :wink: , je n'y avais pas penser alors quelle est toute simple. Sinon au final ma solution correspond en parti a ta deuxième méthode que je viens à l'instant de voir.

En gros je fais une première boucle pour lister les (grandes) zones présentes et à l'intérieur de cette boucle je fais une deuxième boucle qui calcule le nombre de 0 pour chaque sous zone par rapport au résultat de la premiere boucle.

GROUP BY m'a permis d'éliminer les doublons

résultat final : ma requête fonctionne sans rien écrire en "dur"

merci encore

Eléphant du PHP | 145 Messages

18 mars 2009, 17:55

humm ravi d'avoir pus t'aider.

Si tu veux éliminer les doublons, il existe DISTINCT qui est beaucoup moins gourmand et qui fonction très bien :

Code : Tout sélectionner

SELECT DISTINCT champ sur lequel on veux eliminer les doublons, champ2.... FROM table WHERE condition
Si t'a résolu ton problème, pense à un petit [Résolu] :)

Albat90 ;)
La culture, c'est comme la confiture, moins on en a, plus on l'étale.