我只想要这样的事情:
select SUM(*) from `mytable` group by `year`
任何建议?
(我正在使用Zend Framework;如果您有使用ZF而不是纯查询的建议会很棒!)
更新: 我在表格中有大量列,我不想逐一写下他们的名字。
没有想法?
答案 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`";