deux requetes en une

Eléphant du PHP | 107 Messages

01 oct. 2008, 17:55

SGBD = MySQL

Code : Tout sélectionner

Create Table: CREATE TABLE t ( id int(11) default NULL auto_increment, montantPAI char(60) default NULL, codeCLIENT char(60) default NULL, PRIMARY KEY (id) ) TYPE=MyISAM
Bonjour à tous

Voilà, je vous explique le fonctionnement de la requete que je voudrais faire :

le structure de ma table est


id montantPAI codeCLIENT
1 20 VOITURE
2 12 BATEAU
1 2 VOITURE1



Ma table peut contenir des id qui peuvent se repéter

Ceux que je voudrais faire c'est de recupérer les id identique et de additionner les montants correspondants à ces id

j'ai une variable $montantTOTAL qui est le montant total

voici mes requetes
//Ce que je voudrai faire içi c'est de récupérer les id des clients dont total paiament < //$montantTOTAL mais jai fai comme ça 
select id from t where montantPAI <".$montantTOTAL." and codeCLIENT is not NULL ";
	if ($res_r=mysql_query($req_r))   
	{
		if(mysql_num_rows($res_r))
		{
			while($row_r=mysql_fetch_array($res_r))   
			{
				$cltID=$row_r['id'];

 $req_montant ="select sum(montantPAI) as totalPAYE, codeCLIENT  from T where id=".$candID."  group by id ";
	
		if ($res_montant=mysql_query($req_montant))   
		 {
		   $nbMONTANT=mysql_num_rows($res_montant);
   		   if ($nbMONTANT>0)	
		   {
		     while ($row_montant=mysql_fetch_array($res_montant))   
			   	{

                               }
                    }
                  }
la jai fait 2 requete que je pense pourra etre fait en une faute dexpérience

est ce que je peux ecrire ça pour ma premiere requete
select id from t where sum(montantPAI) <".$montantTOTAL." and codeCLIENT is not NULL ";
je pense que c'est faut :-/

Ceux que je veux faire donc c'est de récupérer les id-client dont sum($montantPAI)<$montatTOTAL avec son code client (les codes clients pourront être uniques ou différent)

merki

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

02 oct. 2008, 21:41

Premier souci:
Tu dis que ta table peut contenir les mêmes id plusieurs fois alors que dans la structure de la table tu déclare l'id comme "auto_increment" et en plus "Primary key". C'est comme dire tout le contraire de ce que tu veux.

Auto_increment veut dire que le compteur est incrémentiel cela empêche donc d'avoir les mêmes id
En plus, Primary Key veut dire formellement que l'id est une clé primaire unique ce qui impose les valeurs sans doublons.

Ce qui est logique et pour satisfaire ce que tu veux, il faudrait enlever "auto_increment" et éviter de déclarer un Primary Key sur l'id.


Deuxième souci:
Pour respecter le type de données des champs de la base, tu peux déclarer tes champs numériques en tant que tel :
montantPAI float NOT NULL,
En plus, il faut être strict quand au contrainte NULL ou NOT NULL. Je vois que tu as tout mis en NULL. Ce n'est pas raisonnable, il faut revoir ça. Alors jusqu'à nouvelle précision, vaut mieux fixer NOT NULL pour tous les champs car ils sont là pour être renseignés.

Pour la requête:
Ceux que je veux faire donc c'est de récupérer les id-client dont sum($montantPAI)<$montatTOTAL avec son code client
Tu dois donc regrouper les enregistrements par id pour faire la somme de leurs montants puis retourner seulement ceux dont cette somme est < à la valeur fixée par $montantPAI.
Voici comment :
$sql = "SELECT id, codeclient 
           FROM t 
           GROUP BY id, codeclient HAVING SUM(montantPAI) <".$montantTOTAL;
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène