2011-03-19 4 views
3

Comment puis-je comptabiliser des enregistrements pour deux colonnes dans une table en utilisant différents critères de requête?Mysql multi-count dans une requête

Table ressemble:

user_id | date  | status 
------------------------------ 
     1  | 2011-01-02 | 1 
     2  | 2011-01-03 | 1 
     3  | 2011-01-02 | 0 
     4  | 2011-01-03 | 1 
     1  | 2011-01-02 | 1 

Je veux compter deux valeurs dans une requête. Le premier est le numéro du groupe user_id par statut et le second est le compte du groupe user_id par date.

Comment puis-je faire cela?

+0

utiliser quelque chose comme SELECT COUNT ... –

+0

S'il vous plaît donner un exemple de votre résultat attendu, parce que les comptes par statut n'ont aucun rapport avec les comptes par date. Un produit cartésien est le seul résultat. –

Répondre

4

Vous ne pouvez pas avoir différentes clauses GROUP BY dans la même requête - chaque nombre devra être dans une requête indépendante.

Mais vous pouvez retourner la sortie en une seule requête/ResultSet en utilisant les sous-requêtes (sous-requête dans la clause SELECT):

SELECT COUNT(a.user_id) AS numUsersPerStatus, 
      (SELECT COUNT(b.user_id) 
      FROM YOUR_TABLE b 
     GROUP BY b.date) AS numUsersPerDate 
    FROM YOUR_TABLE a 
GROUP BY a.status 
+1

Si une sous-requête est utilisée dans Select Column, elle ne doit renvoyer qu'une ligne et une colonne, numUsersPerDate renvoie plusieurs lignes pour une date différente? Je pense que cette requête peut donner une erreur d'exécution basée sur des données? Corrigez-moi si je me trompe ..... –

+0

@Nitin Midha: Non, cela ne provoquera pas d'erreur d'exécution. Le numUsersPerDate sera dupliqué pour chaque compte de statut - Le résultat sera un produit cartésien. –

+1

Ensuite, je l'espère, il devrait être dans la clause from avec une jointure croisée .... Il est quelque chose de connu la différence entre SQL Server et MySQL? Pour autant que je me souvienne, dans SQL Server, il va donner une erreur ... –

0

Vous ne pas.

Vous devez utiliser deux requêtes. Il n'y a aucun avantage à le faire avec une seule requête.

Si vous vraiment voulez le faire, vous pouvez essayer ceci:

SELECT 'date' AS grptype, date AS grp, COUNT(DISTINCT user_id) AS cnt 
FROM yourtable 
GROUP BY date 
UNION ALL 
SELECT 'status' AS grptype, status AS grp, COUNT(DISTINCT user_id) AS cnt 
FROM yourtable 
GROUP BY status 

Résultat:

 
grptype grp   cnt 
date  2011-01-02 2 
date  2011-01-03 2 
status  0   1 
status  1   3 

Cependant, je fortement conseiller contre le faire. Vous voulez deux ensembles de résultats différents et indépendants, vous devez donc utiliser deux requêtes distinctes.

+0

L'état UNION ne fonctionne pas - les colonnes de date et d'état sont des types de données différents. Et vous voudriez l'utiliser comme table dérivée/en ligne pour utiliser finalement MAX pour condenser en moins de lignes. –

+0

pourquoi conseilleriez-vous de ne pas faire cela? – rahmanisback

+1

@rahmanisback: Parce que c'est un abus de SQL. Chaque fois que vous mélangez des types de données dans une seule colonne, une licorne meurt. Dans la plupart des bases de données, des choses comme ça ne seraient même pas autorisées. MySQL le permet en raison des conversions de type. Mais juste parce que vous * pouvez * ne signifie pas que vous * devriez *. –