2009-12-27 8 views
0

Pour un jeu, je veux compter le nombre d'utilisateurs inscrits par heure (en utilisant MySQL.). Assez facile, quelque chose comme ça:Comment avoir une requête avec des colonnes nécessitant des conditions différentes dans MySQL?

SELECT COUNT(*), DAY(date_user), HOUR(date_user) 
FROM users, 
GROUP BY DAY(date_user), HOUR(date_user) 

Après cela, je veux seulement prendre en considération les utilisateurs qui ont joué le jeu au moins une fois. J'ai une deuxième table avec des scores.

SELECT COUNT(*), DAY(date_user), HOUR(date_user) 
FROM users, scores 
WHERE users.id = scores.userid 
GROUP BY DAY(date_user), HOUR(date_user) 

Grande ... Maintenant, je veux les deux requêtes pour le résultat d'une table, comme:

Global signups | Signups of playing users | Day | Hour 

Je n'ai pas trouvé une requête de travail pour ce encore. Dois-je utiliser des syndicats? Ou rejoint?

+0

Vous devez utiliser une jointure explicite à la place de 'SELECT A, B WHERE ...'. –

+0

Y a-t-il une raison pour laquelle vous regroupez par heure et par jour, mais pas par mois ou par année? –

+0

Pour Hour & Day, c'était juste un test sur un court ensemble de données, donc ça allait. Je vais ajouter des mois et des années après. –

Répondre

2

est ici une façon:

select 
    day(date_user) 
, hour(date_user) 
, count(distinct u.id) as GlobalSignups 
, count(distinct s.userid) as SignupsOfPlayingUsers 
from users u 
left join scores s on u.id = s.userid 
group by day(date_user), hour(date_user) 

Compter id utilisateur distincts de donne le nombre total d'utilisateurs. Lorsque la jointure à gauche échoue, s.userid sera NULL et NULLs ne sont pas comptés par count(). Donc, count(distinct s.userid) renvoie le nombre d'utilisateurs avec des inscriptions.

+0

Voulez-vous dire 'Quand la jointure gauche échoue'? –

+0

@ Mark Byers: Oui, déjà édité – Andomar

+0

Oh, je devrais probablement avoir rafraîchi avant de commenter, désolé. :) –

Questions connexes