Aller au contenu

Faire la somme des valeurs contenu dans un champs SQL.


Sujets conseillés

Posté

Salut !

Je récupère des valeurs contenu dans un champs SQL, le champs se nomme prodlist.

dans prodlist, j'ai 98,99,100.

Je souhaite faire la somme de ces chiffres...

J'arrive à récupérer ces données, les afficher en colonne, mais pas à les additionner...

Une idée ?

Au passage, je suis autodidacte((comprendre nul)) en langage PHP et je programme à l'arrache malheureusement...

Posté

- Tu définis une variable qui vaut 0 avant ta boucle.

- A chaque boucle tu lui ajoutes ta valeur.

- A la fin de ta boucle tu l'affiches.

Posté

De manière générale, il vaut mieux éviter de boucler sur un jeu de résultats, alors qu'on pourrait obtenir le même résultat en une seule requête :

SELECT SUM(prodlist) FROM ta_table

Accessoirement, je suis également un autodidacte. mais ce n'est pas pour cela que je dirai que je suis nul, bien au contraire !

Posté

Moi j'ai proposé ça car apparemment il disait afficher chaque ligne donc une adition à chaque boucle ne me paraissait pas plus compliquer. Apres si il veut juste la somme en effet la requête seule suffit largement.

+1 pour les autodidacte :).

Posté

En fait, je ne pensais pas à cette solution là.

La réalité est plus compliquée, j'avais simplifier car j'envisageais un résultat à partir de la boucle...

Je vais reformuler.

Je dois récupérer les valeurs du champs prodlist. Ces valeurs sont une liste d'objets possédés par des utilisateurs. Chaque objet à une valeur différente. Par exemple, l'objet 98 vaut 13, le 99 vaut 14 et le 100 vaut 15. Les valeurs sont inscrites dans une autre table nommée valeur.

Avec la configuration de mon site, je pensais à ce début de code inachevé que je ne sais plus continuer... :blush:

CODE

$list=$userrow["prodlist"];

$itemslist = explode(",",$userrow["list"]);

$querystring = "";

foreach($itemslist as $a=>$B) {

$querystring .= "id='$b' OR ";

}

$querystring = rtrim($querystring, " OR ");

$itemsquery = doquery("SELECT * FROM {{table}} WHERE $querystring ", "valeur");

while ($row = mysql_fetch_array($itemsquery)) {

$result.=$row["valeur"]; }

Posté

Je ne vais pas réellement répondre a ta question, mais plutot donner une méthode générale pour ce genre de problème, à savoir stocker une liste d'"objets" dans un champ.

donc dans votre cas il y a deux tables:

une table user qui contient un champ liste d'objets

une table objet

pour simplifier les développements futurs, accélerer les traitements il vaut mieux ce schéma:

une table user avec une clé primaire id

une table objet avec une clé primaire

une table intermédaire liste_objets avec deux champs:

user et objet (qui sont des références aux clés primaires des tables user et objet)

De cette facon, pour obtenir simplement la liste des objets du user toto

select * from liste_objets where user='toto'

qui va retourner

user / objet

toto / 98

toto / 99

toto / 100

Pour avoir la somme, en une seule requete

select sum(prix) from liste_objets,objet where liste_objets.objet=objet.id and liste_objets.user='toto'

Les performances entre cette solution, et celle que vous développez sont incomparables.

Posté

bon finalement j'ai un code qui marche grace a votre aide, je pense que j'initialisait mal la valeur $valeursomme comme suivant...

Qu'en pensez-vous ?

CODE
$valeursomme=0;

$itemslist = explode(",",$userrow["prodlist"]);

$querystring = "";

foreach($itemslist as $a=>$B) {

$querystring .= "id='$b' OR ";

}

$querystring = rtrim($querystring, " OR ");

$itemsquery = doquery("SELECT * FROM {{table}} WHERE $querystring ", "valeur");

while ($row = mysql_fetch_array($itemsquery)) {

$valeursomme=$valeursomme+$row["valeur"]; }

$updatequery = doquery("UPDATE {{table}} SET somme='$valeursomme' WHERE id='".$userrow["id"]."' LIMIT 1", "users");

Posté

Le problème c'est que je ne souhaitais pas rajouter un champs dans ma table user. Ce qui aurait été simple aussi.

A propos, une question est-ce lourd d'avoir une table users avec énormément de champs ?

Est-ce que ça ralenti le site ?

Posté

??

Tu n'as pas besoin de rajouter des champs, tu vas meme pouvoir enlever le champ prodlist.

Par contre tu vas devoir ajouter une table avec deux champs

Posté

Bonsoir,

CODE
$valeursomme=0;

$itemslist = explode(",",$userrow["prodlist"]);

$querystring = "";

foreach($itemslist as $a=>$B) {

$querystring .= "id='$b' OR ";

}

$querystring = rtrim($querystring, " OR ");

$itemsquery = doquery("SELECT * FROM {{table}} WHERE $querystring ", "valeur");

while ($row = mysql_fetch_array($itemsquery)) {

$valeursomme=$valeursomme+$row["valeur"];

}

$updatequery = doquery("UPDATE {{table}} SET somme='$valeursomme' WHERE id='".$userrow["id"]."' LIMIT 1", "users");

Si c'est ça que tu cherches à faire captain_torche avait raison :

CODE
$itemslist = explode(",",$userrow["prodlist"]);

$querystring = "";

foreach($itemslist as $a=>$B) {

$querystring .= "id='$b' OR ";

}

$querystring = rtrim($querystring, " OR ");

$totalquery = doquery("SELECT SUM(valeur) FROM {{table}} WHERE $querystring ", "valeur");

$total = mysql_result($totalquery,0);

$updatequery = doquery("UPDATE {{table}} SET somme='$total' WHERE id='".$userrow["id"]."' LIMIT 1", "users");

Je ne sais pas pour MySQL mais pour MS SQL il n'y a même pas besoin de s'occupé à boucler sur $userrow["prodlist"] pour transformer les "," en "OR" car on peut écrire "WHERE id in ($userrow["prodlist"])" les nombres séparés par des virgules passent très bien.

Posté (modifié)
Je ne sais pas pour MySQL mais pour MS SQL il n'y a même pas besoin de s'occupé à boucler sur $userrow["prodlist"] pour transformer les "," en "OR" car on peut écrire "WHERE id in ($userrow["prodlist"])" les nombres séparés par des virgules passent très bien.

C'est pareil pour MySql puisqu'on envoi une chaine qui contient la requete en paramètre alors on peut très bien faire :

$chaine = "WHERE test IN ( "; 
$chaine .= $userrow["prodlist"];
$chaine .= ")";

mysql_query($chaine);

Modifié par wawa
Posté

Plus je comprends de plus en plus, moins je comprends rien... :whistling:

Bon je vais tacher de peaufiner vos idées. Chacune me parait bonne.

Mais personne ne réponds à ma question: Y'a t'il une incidence sur la performance du site si la table est pleine de champs ou alors est-il préférable de la diviser en 2, avec users et users 2 par exemple...

Posté (modifié)

Je te la refait alors :).

Ton code, à la fin, il donne ça :

$totalquery = doquery("SELECT SUM(valeur) FROM {{table}} WHERE id IN ($userrow["prodlist"])", "valeur");
$total = mysql_result($totalquery,0);

En faite dans la requête SQL :

WHERE id = '98' OR id = '99' OR id = '100'

C'est la même chose que :

WHERE id IN (98,99,100)

Donc il est inutile de faire tout ton bricolage pour transformer ta liste de produits.

Quand au SELECT et bien SUM(valeur) veux dire que tu veux la somme du champ "valeur".

Voila, j'espère que tu as compris :).

Mais personne ne réponds à ma question: Y'a t'il une incidence sur la performance du site si la table est pleine de champs ou alors est-il préférable de la diviser en 2, avec users et users 2 par exemple...

Normalement non,

- Si tu index les champs sur lesquels tu fais souvent des WHERE

- Si tu fait des "SELECT champ1, champ2" plutot que des "SELECT *"

Modifié par Alonnka

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...