2011-03-22 5 views
0

J'ai 4 tables:complexe mysql select requête

user, 
administrative_division, 
assignment, 
user_has_assignment 

entre l'utilisateur et administrative_division il y a un grand nombre à une relation où beaucoup est facile à utiliser et est un administrative_division. Entre l'utilisateur et l'affectation, il existe une relation plusieurs-à-plusieurs via la table user_has_assignment.

je peux obtenir le nombre d'utilisateurs dans chaque administrative_division en utilisant cette commande:

select division_id, count(*) from user group by division_id; 

qui, par exemple, me donne quelque chose comme ceci:

division_id count(*) 
    1   4 
    2   10 

etc.

Je peux obtenir combien d'affectations sont possédées par chaque utilisateur en utilisant cette commande:

select user_id, count(*) from user_has_assignment group by user_id; 

qui donne des résultats similaires

user_id count(*) 
    1  2 
    2  10 

Mais je ne sais pas comment je peux obtenir dans une requête un résultat comme celui-ci:

division_id user_count assignment_count 
    1   10   20 
    2   2   4 

où USER_COUNT est le nombre total d'utilisateurs dans chaque administrative_division et assignment_count représentent le total de toutes les affectations appartenant à des utilisateurs d'une division administrative donnée.

+0

Que voulez-vous que se passe-t-il si vous avez deux utilisateurs dans une division avec la même affectation? Est-ce que cela ajouterait 1 ou 2 au compte? – jswolf19

+0

Cela ajouterait 2 au compte. – Nurjan

Répondre

2

il vous suffit de joindre les tableaux ci-dessus et grouper les résultats par le devision_id, vous obtiendrez une seule ligne par devision comme ceci:

SELECT ad.devision_id, 
     COUNT(DISTINCT u.user_id) AS user_count, 
     COUNT(DISTINCT a.assignment_id) AS assignment_count 
FROM user u 
    JOIN administrative_division ad ON u.devision_id = ad.devision_id 
    LEFT JOIN user_has_assignment ucon ON u.user_id = ucon.user_id 
    LEFT JOIN assignment a ON a.assignment_id = ucon.assignment_id 

contrôle les noms de champs dans la requête et les remplacer en conséquence pour que la requête fonctionne sur votre schéma.

+0

Merci beaucoup, BigFatBaby)). Ça marche. – Nurjan

+0

@Nurzhan: pas de problème du tout - si votre question a été répondue, assurez-vous de vérifier la bonne réponse pour aider d'autres personnes qui pourraient rencontrer un problème similaire – BigFatBaby

+0

@Nurzhan, je ne pense pas que cela ajoutera 2 au compte si deux les utilisateurs d'une division ont la même affectation. – jswolf19