2010-05-11 6 views
1

Les gars ce qui ne va pas avec cette requête SQL:MySQL GROUP BY et JOIN

$sql = "SELECT 
    res.Age, 
    res.Gender, 
    answer.*, 
    $get_sum, 
    SUM(CASE WHEN res.Gender='Male' THEN 1 else 0 END) AS males, 
    SUM(CASE WHEN res.Gender='Female' THEN 1 else 0 END) AS females 
    FROM Respondents AS res 
    INNER JOIN Answers as answer 
     ON answer.RespondentID=res.RespondentID 
    INNER JOIN Questions as question 
     ON answer.Answer=question.id 
    WHERE answer.Question='Q1' 
    GROUP BY res.Age 
    ORDER BY res.Age ASC"; 

la get_sum $ est un tableau de déclaration sql provenant d'une autre table:

$sum[]= "SUM(CASE WHEN answer.Answer=".$db->f("id")." THEN 1 else 0 END) AS item".$db->f("id"); 
$get_sum = implode(', ', $sum); 

la requête ci-dessus retour ces valeurs :

Age: 20  
    item1 0 
    item2 1 
    item3 1 
    item4 1 
    item5 0 
    item6 0 
Subtotal for Age 20  3 

Age: 24  
    item1 2 
    item2 2 
    item3 2 
    item4 2 
    item5 1 
    item6 0 
Subtotal for Age 24  9 

Il devrait retourner:

Subtotal for Age 20  1 
Subtotal for Age 24  2 

Dans mes données d'échantillon il y a 3 répondants 2 ont 24 ans et l'autre 20 ans. Je veux totaliser le nombre de répondants par âge.

+0

Veuillez essayer de réduire votre requête au minimum absolu. Afficher également les résultats de la requête sql Je suppose que vos résultats proviennent de votre application? – lexu

Répondre

0
$sql = "SELECT 
    res.Age, 
    COUNT(1) AS SubTotalRespondentsByAge 
    $get_sum, 
    SUM(CASE WHEN res.Gender='Male' THEN 1 else 0 END) AS males, 
    SUM(CASE WHEN res.Gender='Female' THEN 1 else 0 END) AS females 
    FROM Respondents AS res 
    INNER JOIN Answers as answer 
     ON answer.RespondentID=res.RespondentID 
    INNER JOIN Questions as question 
     ON answer.Answer=question.id 
    WHERE answer.Question='Q1' 
    GROUP BY res.Age 
    ORDER BY res.Age ASC" 

Vous ne pouvez pas inclure de colonnes dans la clause select qui ont une relation plusieurs-à-un avec l'âge. J'ai donc supprimé les colonnes res.gender et answers.*. Ce que vous voulez, c'est count (1) des groupes (puisque vous groupez par res.Age).