2017-08-16 1 views
1

Je tiré par les cheveux des données du même nom de la table, mais avec des conditions différentes et j'ai demandé 3 fois et le résultat est:Comment faire pour additionner des données de la même table avec des conditions différentes?

101=>1 
301=>1 
501=>2 
502=>4 
--------------- 
101=>2 
501=>1 
--------------- 
101=>1 
501=>1 

dont la première colonne est des salles de classe et la deuxième colonne sont les valeurs. Quelle est la meilleure façon de résumer ces valeurs avec la même classe pour le résultat serait:

101 = 4 
301 = 1 
501 = 4 
502 = 4 

Ma commande de requête:

$query = $db->prepare("SELECT COUNT(std_id) AS total, std_class FROM attendance WHERE att_mode IN('mode-01','mode-04') AND att_attend='0' AND att_date=CURDATE() GROUP BY std_class ORDER BY std_class"); 
    $query->execute(); 
    while ($char = $query->fetch(PDO::FETCH_OBJ)) { 
     $labels2[] = $char->std_class.'-'.$char->total; 
     $link[] = $char->std_class; 
    } 
$query = $db->prepare("SELECT COUNT(std_id) AS total_sick,std_class FROM attendance WHERE att_mode ='mode-01' AND att_attend='2' AND att_date=CURDATE() GROUP BY std_class ORDER BY std_class"); 
    $query->execute(); 
    while($char = $query->fetch(PDO::FETCH_OBJ)){ 
     $sickCount[] = $char->std_class.'-'.$char->total_sick; 
    } 
$query = $db->prepare("SELECT COUNT(std_id) AS total_leave,std_class FROM attendance WHERE att_mode ='mode-01' AND att_attend='3' AND att_date=CURDATE() GROUP BY std_class ORDER BY std_class"); 
    $query->execute(); 
    while($char = $query->fetch(PDO::FETCH_OBJ)){ 
     $leaveCount[] = $char->std_class.'-'.$char->total_leave; 
    } 

Répondre

0

J'ai finalement trouvé une solution. Au lieu de faire 3 requêtes, je ne lance qu'une seule requête. requête de travail est:

$query = $db->prepare("SELECT COUNT(std_id) AS total, std_class FROM attendance WHERE att_mode IN('mode-01','mode-04') AND att_attend IN('0','2','3') AND att_date=CURDATE() GROUP BY std_class ORDER BY std_class"); 

La clause "WHERE" répondrait à la "att_mode" qui contient la valeur '0', '2' et '3'. Ensuite, j'ai obtenu un résultat souhaité. Merci pour toutes les réponses précédentes.

0

Essayez celui-ci en utilisant la sous-requête.

"SELECT std_class , COUNT(std_id) as total ,(SELECT COUNT(std_id) AS total_sick FROM attendance WHERE att_mode ='mode-01' AND att_attend='2' AND att_date=CURDATE() GROUP BY std_class ORDER BY std_class) AS total_sick , (SELECT COUNT(std_id) FROM attendance WHERE att_mode ='mode-01' AND att_attend='3' AND att_date=CURDATE() GROUP BY std_class ORDER BY std_class) AS total_leave FROM attendance WHERE att_mode IN('mode-01','mode-04') AND att_attend='0' AND att_date=CURDATE() GROUP BY std_class ORDER BY std_class " 

Si ne fonctionne pas alors laissez-moi savoir ...

+0

J'ai reçu cette erreur: SQLSTATE [21000]: Violation de la cardinalité: 1242 La sous-requête renvoie plus d'une ligne – Wasinha

0

EDIT: La réponse de Priyank est évidemment mieux que cela se fait par le biais de SQL, donc pas de frais généraux de PHP.

Je voudrais prendre le résultat de chaque requête, le coller dans un tableau associatif, et les boucler. Il ressemblerait à ceci:

Comme mentionné
$result = db_query1(); 
$total = array(); 
foreach ($result as $classroom => $value) { 
    $total[$classroom] += $value; 
} 

$result = db_query2(); 
foreach ($result as $classroom => $value) { 
    $total[$classroom] += $value; 
} 

$result = db_query3(); 
foreach ($result as $classroom => $value) { 
    $total[$classroom] += $value; 
} 

print_r($total); 
0

, la réponse de Priyank devrait être le chemin à parcourir, mais depuis avant de voir les autres réponses que j'ai écrit une petite fonction pour vous, je vais le poster de toute façon, car il pourrait être utile si vous ne voulez pas pour une raison quelconque tout faire en SQL.

function mergeAndSum() { 
    // get all the given arguments and put them into an array 
    $arrays = func_get_args(); 

    // create an array that will contain the output 
    $output = array(); 

    // loop through all the arguments 
    foreach($arrays as $array) { 
     // if an argument is not an array it will be skipped 
     if(!is_array($array)) { 
      continue; 
     } 
     // otherwise it will be iterated 
     foreach($array as $key => $value) { 
      // if the key is already in the $output array 
      if(array_key_exists($key,$output)) { 
       // add the value to the existing onve for that key 
       $output[$key] += $value; 
      } else { 
       // else store in the $output array the key with it's value 
       $output[$key] = $value; 
      } 

     } 

    } 

    return $output; 

} 

Donc, en supposant que vous avez-vous trois tableau avec les résultats des requêtes

$link = array(
    101=>1, 
    301=>1, 
    501=>2, 
    502=>4, 
); 
$sickCount = array(
    101=>2, 
    501=>1 
); 
$leaveCount = array(
    101=>1, 
    501=>1 
); 

vous les passer juste à

$output = mergeAndSum($link,$sickCount,$leaveCount); 

et votre sortie $ sera comme vous le souhaitez

(
    101 => 4 
    301 => 1 
    501 => 4 
    502 => 4 
) 

En gardant à l'esprit que la méthode SQL serait mieux, cette fonction serait assez flexible pour être utilisée dans d'autres cas similaires où vous avez des tableaux à fusionner et à additionner