MySQL: как можно извлечь SUM () из всех полей в одном запросе? - PullRequest
2 голосов
/ 12 мая 2010

Я просто хочу что-то вроде этого:

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

есть предложения?

(Я использую Zend Framework; если у вас есть предложение с использованием ZF, а не чистого запроса, было бы здорово!)

Обновление: У меня масса столбцов в таблице, и я не хочу записывать их имена один за другим.


Нет идей ??

Ответы [ 5 ]

5 голосов
/ 12 мая 2010
SELECT      SUM(column1) + SUM(column2) + SUM(columnN) 
FROM        mytable 
GROUP BY    year
3 голосов
/ 12 мая 2010

Используя 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();

Подробнее см. Документацию Zend_Db_Select в руководстве по ZF.

РЕДАКТИРОВАТЬ: мой плохой, я думаю, я неправильно понял ваш вопрос. Приведенный выше запрос вернет каждый столбец, но не сумму всех столбцов. Переписав запрос Maxem, чтобы вы могли использовать его с адаптером Zend Framework DB, он может выглядеть как

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

Вы можете использовать fetchCol () для получения одного результата.

2 голосов
/ 18 мая 2010

Похоже, вы не хотите явно перечислять 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() для динамического получения полей.

1 голос
/ 26 мая 2012

Выполнено в 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();
}
0 голосов
/ 02 мая 2012

Или не использовать 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`";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...