2012-08-06 4 views
0

Je dois écrire une requête qui affiche, pour chaque activité, le nombre de mâles et le nombre de femelles.MySQL - Ai-je besoin d'une requête imbriquée?

De préférence dans un format à 3 colonnes, nom_activité, masculin (colonne calculée), féminin (colonne calculée).

Je pense que je pourrais avoir besoin d'utiliser des requêtes imbriquées, mais je n'arrive pas à comprendre comment. Ou cela pourrait-il être fait en utilisant simplement GROUP BY?

Mes tableaux sont:

enfant child_id child_fname child_sname child_gender etc etc

Activité activity_id ACTIVITY_NAME etc etc

Child_Activity_Item child_id activity_id

Merci

Répondre

0

Essayez cette requête -

SELECT 
    a.activity_id, 
    a.activity_name, 
    COUNT(IF(c.child_gender = 'M', c.child_gender, NULL)) male, 
    COUNT(IF(c.child_gender = 'F', c.child_gender, NULL)) female 
FROM 
    Activity a 
    JOIN Child_Activity_Item ca 
    ON ca.activity_id = a.activity_id 
    JOIN Child c 
    ON c.child_id = ca.child_id 
GROUP BY a.activity_id 
+0

Merci, puis-je vous demander s'il y a une différence entre utiliser JOIN et WHERE? Comme je n'ai pas appris à devenir membre de mon cursus, c'est nouveau pour moi! –

+0

Dans ce cas, vous pouvez utiliser 'FROM table1, table2, table3' avec la condition WHERE, le résultat sera le même. Je préfère seulement utiliser les clauses JOIN. – Devart

+0

Ah ok, merci. Oui c'est ce que j'ai fait :) –

0

c'est ce que vous cherchez:

SELECT MaleList.Activity_Name, 
     MaleList.totalMale, 
     FemaleList.totalFemale, 
FROM 
(
    SELECT a.Activity_ID, 
      a.Activity_Name, 
      COUNT(c.child_gender) totalMale 
    FROM Activity a 
       INNER JOIN Child_Activity_Item b 
        on a.activity_id = b.activity_ID 
       INNER JOIN Child c 
        on b.child_id = c.child_id 
    WHERE c.child_gender = 'male' 
    Group BY a.Activity_ID 
) as MaleList INNER JOIN 
(
    SELECT a.Activity_ID, 
      a.Activity_Name, 
      COUNT(c.child_gender) totalFemale 
    FROM Activity a 
       INNER JOIN Child_Activity_Item b 
        on a.activity_id = b.activity_ID 
       INNER JOIN Child c 
        on b.child_id = c.child_id 
    WHERE c.child_gender = 'female' 
    Group BY a.Activity_ID 
) as FemaleList 
    ON MaleList.Activity_ID = FemaleList.Activity_ID 

vous ne pouvez pas directement obtenir un résultat à trois colonnes, car il n'y a qu'une seule colonne détient le genre.

+0

Merci, je donnerai ce un essai! –