2010-05-12 4 views
2

Я просто хочу Somthing так:MySQL: Как получить SUM() из всех полей в одном запросе?

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

любое предложение?

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

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


Нет Идея ??

ответ

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

Использование Zend_Db_Select в Zend Framework, ваш запрос может выглядеть

$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 больше.

EDIT: Мой плохой, я думаю, что неправильно понял ваш вопрос. В запросе, указанном выше, будет возвращена каждая суммарная сумма, но не сумма всех столбцов. Переписав запрос Maxem, так что вы можете использовать его с адаптером Zend Framework DB, это может выглядеть

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

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

2

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

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`"; 
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(); 
} 
Смежные вопросы