2010-06-07 18 views
0

J'essaie de faire une recherche sur notre table demographioc pour afficher quelques statistiques. Cependant, étant donné que la sortie de la table démographique est trop importante, je veux le faire en une seule requête.MYSQL - plusieurs états de compte

Il y a 2 champs qui sont importants: le sexe, last_login

Je veux être en mesure d'obtenir le nombre total de connexions pour différentes plages de dates (il y a 1 jour <, il y a 1-7 jours, 7-30 jours il ya, etc) GROUPÉ PAR sexe

Je sais maintenant comment le faire pour une plage de dates. Par exemple moins de 1 jour:

SELECT sex, count(*) peeps 
    FROM player_account_demo 
WHERE last_demo_update > 1275868800 
GROUP BY sex 

qui retourne:

sex  peeps 
---------------- 
UNKNOWN 22 
MALE  43 
FEMALE 86 

Cependant je dois faire une fois pour chaque plage. Y a-t-il un moyen d'obtenir toutes les 3 gammes ici?

Je veux que mon résultat final à ressembler à quelque chose comme ceci:

sex  peeps<1day  peeps1-7days  peeps7-30days 

Merci!

REMARQUE IMPORTANTE: dernière demo_update est le temps d'époque (horodatage unix)

Répondre

2
SELECT sex, 
    SUM(IF(DATEDIFF(NOW(),last_login) < 1,1,0)), 
    SUM(IF(DATEDIFF(NOW(),last_login) BETWEEN 1 AND 7,1,0)), 
    SUM(IF(DATEDIFF(NOW(),last_login) BETWEEN 7 AND 30,1,0)) 
FROM player_account_demo 
GROUP BY sex 
+0

Thx cela m'a mis sur la bonne voie – darudude

0

Vous souhaitez utiliser un Pivot Table.

+0

Une table pivotante est pour l'affichage droite? Je veux être en mesure de tout sélectionner dans une requête sans avoir à sélectionner toute la table et tout faire en php. – darudude

+0

Ce n'est pas un concept pris en charge par le langage de requête. Si vous voulez vraiment le faire, vous pouvez bidouiller une vérification au cas par cas dans votre instruction SELECT (voir par exemple la réponse de Wrikken). – VeeArr

+1

'PIVOT' et' UNPIVOT' sont ANSI je crois, mais seulement pris en charge sur SQL Server 2005+ et Oracle 11g +. CASE est ANSI-92 d'ailleurs ... –