代码之家  ›  专栏  ›  技术社区  ›  Alexar

MySQL:如何在一个查询中获取所有字段的sum()?

  •  2
  • Alexar  · 技术社区  · 15 年前

    我只想要这样的东西:

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

    有什么建议吗?

    (我正在使用Zend框架;如果您有使用ZF而不是纯查询的建议,那就太好了!)

    更新: 我有很多列在表中,我不想一列一列地写下它们的名字。


    不知道??

    5 回复  |  直到 11 年前
        1
  •  5
  •   Maxem    15 年前
    SELECT      SUM(column1) + SUM(column2) + SUM(columnN) 
    FROM        mytable 
    GROUP BY    year
    
        2
  •  3
  •   Jeremy Kendall    15 年前

    使用zend框架的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();
    

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

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

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

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

        3
  •  2
  •   David Weinraub    15 年前

    听起来您不想显式地枚举列,而希望对所有列(可能不包括 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() 动态获取字段。

        4
  •  1
  •   Ash    11 年前

    在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();
    }
    
        5
  •  0
  •   Carcione    13 年前

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