PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 07-09-2010 19:23:17

cramj
Membre
Inscription : 02-11-2009
Messages : 15

2 COUNT() en une seule requete

Bonsoir,

Je n'arrive pas à écrire en une seule requête le COUNT sur 2 types d'information.

Je m'explique.
voici la table :

user_id   idle  
1         1
22        1
1         0
1         0
1         0
23        0

déjà, ne chercher que les idle=0
ensuite, mon résultat doit me sortir :
le nombre de user_id = 1
le nombre de user_id != 1

Pour ceux qui connaissent fluxBB, il s'agit de compter le nombre de membres connectés ainsi que les invités.
user_id = 1 : invité
user_id != 1 : membre
idle = 0 : connecté
idle  = 1 : déconnecté

le résultat donnerait : 1 membre et 3 invités connectés

Je sens qu'il y a encore une histoire de SELECT imbriqués...

J'ai essayé, sans succès, plusieurs requêtes du genre :

SELECT DISTINCT user_id, COUNT( user_id )
 FROM (
  SELECT user_id
   FROM pun_online
   WHERE idle =0
   GROUP BY user_id, idle
  ) AS nb
 GROUP BY user_id

et forcément, une fois de plus ça ne retourne pas le résultat escompté hmm

Je pourrais très bien faire un SELECT tout bete, puis traiter tout ça dans un while, mais quand on peut faire travailler MySQL, pourquoi s'en priver wink
Merci à vous

Dernière modification par cramj (07-09-2010 19:24:08)

Hors ligne

#2 08-09-2010 04:02:14

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : 2 COUNT() en une seule requete

Saluton,
Tu ne peux pas, dans le même GROUP BY compter une chose : user_id==1, et son contraire : user_id !=1.
Ta requête devrait donc plutôt ressembler à qqe chose comme ça :

SELECT SUM(IF(user_id=1,1,0)) AS invités,
       SUM(IF(user_id <> 1,1,0)) AS membres
WHERE idle=0

Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#3 08-09-2010 10:11:08

cramj
Membre
Inscription : 02-11-2009
Messages : 15

Re : 2 COUNT() en une seule requete

Bonjour et merci Maljuna Kris,
ça fonctionne à merveille.

Je me doutais bien qu'un seul GROUP BY ne suffisait pas, c'est pour ça que j'ai testé plusieurs requêtes avec 2. Mais quels champs grouper ? ... et comment lui faire comprendre les user_id à compter ? ...  je faisais en effet mauvaise route avec ce casse tête !

Mais juste pour comprendre :
En voyant ta proposition, et avant d'essayer, je pensais que SUM allait additionner les valeurs.
Pour les invités, ok. Mais pour les membres : id 23 + id 40 = membres → 63

Quand j'ai vu que SUM retournait le résultat escompté, j'ai testé avec COUNT + IF (ce qui devrait aussi être faisable ?). Mais je n'ai pas trouvé la syntaxe qui ne me retourne pas d'erreur...


Décidément, en dehors des SELECT *, je suis vraiment une quiche yikes

Dernière modification par cramj (08-09-2010 10:11:44)

Hors ligne

#4 08-09-2010 12:51:04

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : 2 COUNT() en une seule requete

Si tu regardes bien j'ai remplacé les COUNT par des SUM(IF)) qui somment des 1 si c'est vrai et des 0 si c'est faux.
C'est tout bête, en fait.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#5 08-09-2010 15:02:19

cramj
Membre
Inscription : 02-11-2009
Messages : 15

Re : 2 COUNT() en une seule requete

En effet tout bête, maintenant que je comprends le comportement du IF (que je n'avais jamais utilisé).
Alors pour m'assurer d'avoir bien compris, je me suis amusé à additionner les ID en faisant SUM(IF(user_id <> 1,user_id,0)) AS membres
oui, un rien m'amuse smile

Merci encore pour toutes ces réponses Maljuna Kris et tous les autres.

PS :
Au moment où je rédige ce post, je m'aperçois qu'on retrouve une syntaxe similaire avec un tableur : =SI(A1=1;A1;0)

Hors ligne

#6 09-09-2010 05:50:22

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : 2 COUNT() en une seule requete

La syntaxe SQL standard serait

SUM(CASE WHEN user_id <> 1 THEN user_id ELSE 0 END)

Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

Pied de page des forums