MySQL:如何在一个Query中获取所有字段的SUM()?

时间:2010-05-12 10:24:20

标签: mysql zend-framework sum

我只想要这样的事情:

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

任何建议?

(我正在使用Zend Framework;如果您有使用ZF而不是纯查询的建议会很棒!)

更新: 我在表格中有大量列,我不想逐一写下他们的名字。


没有想法?

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

使用Zend Framework的Zend_Db_Select,您的查询可能看起来像

$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();

有关详细信息,请参阅ZF手册中的Zend_Db_Select文档。

编辑:我的坏,我想我误解了你的问题。上面的查询将返回每个列的总和,但不是所有列的总和。重写Maxem的查询,以便您可以将它与Zend Framework数据库适配器一起使用,它可能看起来像

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

您可以选择使用fetchCol()来检索单个结果。

答案 2 :(得分:2)

听起来你不想显式枚举columnn,并且你想要在所有行上对所有列(可能不包括year列)求和,并按年分组。

请注意,方法Zend_Db_Table::info(Zend_Db_Table_Abstract::COLS)将返回一个包含基础表的列名的数组。您可以使用该数组构建查询,如下所示:

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');

我还没有测试过具体的语法,但是这个想法的核心是调用info()来动态获取字段。

答案 3 :(得分:1)

在ZF而不是纯查询中完成,您不必逐个编写列的名称。 (我假设您正在扩展Zend_Db_Table_Abstract)

如果你问如何写

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

这是如何完成的:

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

答案 4 :(得分:0)

或者不使用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`";