Page 1 sur 1
Requete avec somme en group by
Posté : 04 juil. 2006, 16:03
par coolhead
bonjour,
j'ai un table dans laquelle je souhaite faire une requete afin d'avoir une somme sur un group by mais je ne sais pas comment m'y prendre.
Ma table :
Id_user || Date || Infra
1 || ... || 2
1 || ... || 1
2 || ... || 1
1 || ... || 3
1 || ... || 3
je veux faire un group by id_user mais remonter la somme de Infra en group by aussi.
du style :
1 : 1 = 1, 2 = 1, 3 = 2
2 : 1 = 1
je ne sais pas comment faire deux group by avec somme.
Merci
Posté : 04 juil. 2006, 16:11
par ouckileou
Est-ce que tu pourrais dire ce que tou souhaites obtenir en français plutôt que la vague manière de l'obtenir ? ce serait plus simple

Posté : 04 juil. 2006, 16:25
par coolhead
je souhaite remonter la somme des infra de chaque users, users par users.
Un user peut avoir à plusieurs dates ou à une même dates plusieurs infra qui sont des valeurs de 1 à 10.
ainsi j'obtiendrai un tableau, user par user avec 10 colonnes contenant la somme de infra =1, infra=2, ... infra=10.
J'espère avoir étais plus clair.
j'admet avoir fait dans le language tchèque lors de mon dernier message.
Posté : 04 juil. 2006, 16:38
par ouckileou
Tu veux compter le nombre de Infra à 1, Infra à 2, Infra à n non ? c'est donc plutôt COUNT et pas SUM
Ce qui donnerait a priori ceci, tout simplement
Code : Tout sélectionner
SELECT Id_user, Infra, COUNT(Infra) AS nb_infra
FROM table
GROUP BY Id_user, Infra
Posté : 10 juil. 2006, 13:21
par Invité
Merci. Exact je ne devais pas faire de SUM mais COUNT.
Par contre ce genre de requete me dissocie chaque infraction de chaque user.
En effet l'idée étant d'avoir un tableau jeune par user (sur chaque ligne), infraction par infraction (dans les colones). Ici j'obtiens une ligne par user et par infraction.
Comment faire le compte user par user de chaque type d'infraction ?
| Utilisateur | Infra type 1 | Infra type 2 | Infra type 3 |
| user 001 | 0 | 2 | 0 |
| user 002 | 1 | 0 | 4 |
| user 003 | 0 | 0 | 1 |
Posté : 10 juil. 2006, 13:24
par coolhead
j'ai oublier de repréciser la table des infras :
Un user peut avoir à plusieurs dates ou à une même dates plusieurs infra qui sont des valeurs de 1 à 10.
Table Infra :
id, jeune, date, infra, comment
où infra vaut 1 à 10.
Posté : 10 juil. 2006, 13:43
par ouckileou
Par contre ce genre de requete me dissocie chaque infraction de chaque user.
Normal, une requête te renvoie des lignes, si tu groupes sur des valeurs ça te renvoie chaque ligne qui vérifie le groupement.
En effet l'idée étant d'avoir un tableau jeune par user (sur chaque ligne), infraction par infraction (dans les colones). Ici j'obtiens une ligne par user et par infraction.
Comment faire le compte user par user de chaque type d'infraction ?
Et bien tu l'as ici ton compte user par user pour chaque type, tu as juste à faire ta mise en forme lors de l'affichage.
Pour chaque user tu crées des colonnes avec les infra, quand ça change de user tu crées une nouvelle ligne
Posté : 10 juil. 2006, 13:56
par coolhead
c'est a moitié chaud à faire ça
Je balance un /tr et un nouveau tr à chaque changement de user ?
il faut donc que je garde dans ma boucle le user_old que je compare avec user_new ?
je vais essayer
Merci

Posté : 10 juil. 2006, 13:58
par ouckileou
c'est a moitié chaud à faire ça
Je balance un /tr et un nouveau tr à chaque changement de user ?
il faut donc que je garde dans ma boucle le user_old que je compare avec user_new ?
Exactement
Et c'est tout con à faire

Posté : 10 juil. 2006, 14:03
par coolhead
c'est ça le truc avec les MODULOS ?
j'utilise le % user.
Mais par contre je ne peux pas me débarrasser d'un </tr> en trot au début et un <tr> en trop à la fin de ma boucle.
IE accepte mais je pense que les mozilla et compagnie vont me faire de vieille erreurs.
Posté : 10 juil. 2006, 14:05
par ouckileou
Non rien à voir avec le modulo
Code : Tout sélectionner
TantQue il y a des lignes Faire
Si user_ligne <> user_courant Alors
Ecrire nouvelle ligne et infos user
FSi
Ecrire info infra
FTantQue
Il suffit de rajouter la fermeture de la ligne et du tableau après la boucle et c'est bon, tu n'auras pas de problème de balise en trop du coup
Posté : 10 juil. 2006, 14:23
par coolhead
Vraiment désolé.
Mais là je galère vraiment.
En effet dans ma requete je remonte que ceux pour qui il y a une infraction.
Ainsi, le user 1 peut avoir ça première infra à une valeur égale à 4.
Mais il me faut mettre dans les colonnes 1 à 3 un ZERO comme quoi il n'a pas d'infra 1, 2 et 3.
Dans le boucle de construction du tableau avec changement de user si user_old <> user_new (qui ne marche pas d'ailleur) je ne vois pas comment l'inséer.
$col = 1;
while ($Array = mysql_fetch_array($Req)) {
$user = $Array['user'];
$infra = $Array['infra'];
$nb_infra = $Array['nb_infra'];
if($col == 1 ) { <tr>
<td>$user</td>
for($cols = $col; $col == $Infra; $col++) {
echo "<td>0</td>";
}
echo "<td>$NbInfra</td>";
$col++;
if($col == 10) {
echo "</tr>\n"; $col = 1;
}
}
Posté : 10 juil. 2006, 15:10
par ouckileou
Pour un peu plus de clarté tu peux passer par un tableau intermédiaire :
1 - pour chaque user (tu adaptes le principe user_old <> user_new) tu crées un tableau de 1 à 10 rempli avec des zéros
2 - pour chaque infra rencontrée tu écrases le zéro correspondant avec la valeur
ensuite tu affiches les valeurs de ce tableau dans un tableau HTML
Pourquoi ça ne marche pas ?
Ce que je t'ai filé c'est de l'algo, il faut voir comment tu l'as codé
Normalement, le signe <> est équivalent à !=
Posté : 10 juil. 2006, 15:34
par coolhead
tu écrases le zéro correspondant avec la valeur
avec du javascript ?
je ne vois pas comment écraser une valeur pendant ma boucle
Posté : 10 juil. 2006, 16:30
par ouckileou
avec du javascript ?
Bah non avec du PHP
je ne vois pas comment écraser une valeur pendant ma boucle
$tab[0] = 0; // initialisation
$tab[0] = 12; // écrasement
C'est tout

Tu dois avoir une fonction qui t'initialise un tableau avec la même valeur partout, regarde dans la doc