2010-05-12 14 views
2

Je veux juste somthing comme ceci:MySQL: Comment récupérer SUM() de tous les champs dans une requête?

select SUM(*) from `mytable` group by `year` 

toute suggestion?

(j'utilise Zend Framework, si vous avez une suggestion à l'aide ZF plutôt que pur requête serait super!)

Mise à jour:J'ai une masse de colonnes dans le tableau et je ne veux pas écrire leur nom un par un.


No Idea ??

Répondre

5
SELECT  SUM(column1) + SUM(column2) + SUM(columnN) 
FROM  mytable 
GROUP BY year 
3

Utilisation du Zend_Db_Select de Zend Framework, votre requête pourrait ressembler

$db = Zend_Db::factory(...options...); 

$select = $db->select() 
    ->from('mytable', array('sum1' => 'SUM(`col1`)', 'sum2' => 'SUM(col2)') 
    ->group('year'); 

$stmt = $select->query(); 
$result = $stmt->fetchAll(); 

Consultez la documentation Zend_Db_Select dans le manuel ZF pour plus.

EDIT: Mon mauvais, je pense que j'ai mal compris votre question. La requête ci-dessus retournera chaque colonne additionnée, mais pas la somme de toutes les colonnes. Réécriture la requête de Maxem afin que vous puissiez l'utiliser avec un adaptateur DB Zend Framework, il pourrait ressembler à

$sql = '<insert Maxem's query here>'; 
$result = $db->fetchAll($sql); 

Vous pouvez choisir d'utiliser fetchCol() pour récupérer le résultat unique.

2

Il semble que vous ne souhaitiez pas énumérer explicitement la colonne et que vous vouliez additionner toutes les colonnes (excluant probablement la colonne year) sur toutes les lignes, avec un regroupement par année.

Notez que la méthode Zend_Db_Table::info(Zend_Db_Table_Abstract::COLS) renverra un tableau contenant les noms des colonnes de la table sous-jacente. Vous pouvez construire votre requête en utilisant ce tableau, quelque chose comme ce qui suit:

Zend_Db_Table::setDefaultAdapter($db); 
$table = new Zend_Db_Table('mytable'); 
$fields = $table->info(Zend_Db_Table_Abstract::COLS); 
unset($fields['year']); 
$select = $table->select(); 
$cols = array(); 
foreach ($fields as $field){ 
    $cols[] = sprintf('SUM(%s)', $field); 
} 
$select->cols(implode(' + ', $cols)); 
$select->group('year'); 

Je ne l'ai pas testé la syntaxe spécifique, mais le noyau de l'idée est l'appel à info() pour obtenir les champs dynamiquement.

0

Ou ne pas utiliser Zend ...

function mysql_cols($table){ 
    $sql="SHOW COLUMNS FROM `".$table."`"; 
    $res=mysql_query($sql); 
    $cols=array(); 
    while($row=mysql_fetch_assoc($res))$cols[]=$row['Field']; 
    return $cols; 
} 

$cols=mysql_cols("mytable"); 
$select_sql=array(); 
foreach($cols as $col){ 
    $select_sql[]="SUM(`".$col."`)"; 
} 
$select_sql=implode('+',$select_sql); 

$sql="select (".$select_sql.") from `mytable` group by `year`"; 
1

Fait dans ZF plutôt que pur requête et vous ne devez pas écrire le nom des colonnes un par un. (je suppose que vous étendez Zend_Db_Table_Abstract)

Si vous vous demandez comment écrire

select SUM(*) from `mytable` group by `year` 

Voici comment cela se fait:

public function sumOfAllFields(){ 
return $this->fetchAll($this->select()->from('mytable','SUM(*)')->group('year'))->toArray(); 
}