Posting in the Magento forums has been disabled pending the implementation of a new and improved forum solution which should better serve the community.

For new questions please post at magento.stackexchange.com, the community-run support site for the Magento community. We will be providing updates on the new forum solution soon. For questions or concerns please email community@magento.com.

Magento Forum

Как сделать в magento выборку из двух таблиц с группировкой и суммированием
 
Dim0S
Jr. Member
 
Total Posts:  5
Joined:  2009-07-07
 

Есть две таблицы

tab1
name 
value
a         1
b         2
c         4
d         1
a         3
c         5

tab2
name 
value
e         8
b         3
c         4
c         2
d         1

то есть есть одинаковые имена как внутри одной таблицы, так и между обеими.

надо получить сгруппированные по name и просуммированные по value поля таблицы tab1, и то же сделать с таблицей tab2, результат объединить по name и из значений сумм tab1 вычесть значения сумм tab2.

то есть на выходе должно получиться

tab3
name 
value
a     
(1+3)-(0)=4
b     
(2)-(3)=-1
c     
(4+5)-(4+2)=3
d     
(1)-(1)=0
e     
(0)-(8)=-8

Задача казалось бы тривиальная, но не получается у меня ее осилить :( .Может есть у кого какие идеи?

 
Magento Community Magento Community
Magento Community
Magento Community
 
Dmitry Bashlov
Member
 
Avatar
Total Posts:  70
Joined:  2008-03-13
Chicago, IL, USA
 

Если это вопрос по SQL, то возможно вам поможет UNION
http://www.mysql.ru/docs/man/UNION.html

Можно также слить в одну temp таблицу эти 2 и сделать группировку с суммированием.

Если вам по magento, то magento использует Zend Framework для общения с базой и вообще много чего оттуда.

Вот ссылка как это реализовать на Zend Framework запросы к базе
http://framework.zend.com/manual/en/zend.db.select.html

 
Magento Community Magento Community
Magento Community
Magento Community
 
Dim0S
Jr. Member
 
Total Posts:  5
Joined:  2009-07-07
 

Спасибо за ответ!

После некоторых экспериментов я пришел к выводу, что UNION отдельно не поможет. Запрос

SELECT nameSUMvalue ) as value
FROM tab1
GROUP BY name
UNION
SELECT name
SUMvalue ) * -as value
FROM tab2
GROUP BY name
возвращает
tab3
name 
value
a       4
b       2
c       9
d       1
b       
-3
c       
-6
d       
-1
e       
-8
То есть должна помочь временная таблица, с последующей выборкой с группированием по name и суммированием value.
Но возникла проблема - использование union в Zend Framework я не нашел.
По отдельности код
$icollection->getSelect()->reset(Zend_Db_Select::FROM)
                 ->
from(array('main_table' => 'tab1'),
                        array(
'query' => 'SUM(value) as value'))
                 ->
group('name');
и
$ocollection
->getSelect()->reset(Zend_Db_Select::FROM)
                 ->
from(array('main_table' => 'tab2'),
                        array(
'query' => 'SUM(value) as value'))
                 ->
group('name');
работает, но как их объединить?
и как в magento использовать временную таблицу, чтобы сделать из нее результирующий запрос?
 
Magento Community Magento Community
Magento Community
Magento Community
 
Dim0S
Jr. Member
 
Total Posts:  5
Joined:  2009-07-07
 

Все, разобрался сам наконец-то smile

 
Magento Community Magento Community
Magento Community
Magento Community
 
Dmitry Bashlov
Member
 
Avatar
Total Posts:  70
Joined:  2008-03-13
Chicago, IL, USA
 

Ну и запости сюда решение. Может комуто понадобится - тебя добрым словом вспомнят.

 
Magento Community Magento Community
Magento Community
Magento Community
 
Dim0S
Jr. Member
 
Total Posts:  5
Joined:  2009-07-07
 

protected function _prepareCollection()
  
{
      $icollection 
Mage::getModel('goods/goods')->getCollection();
      
$icollection->getConnection()->query("CREATE TEMPORARY TABLE goods TYPE=HEAP 
                                            SELECT resource_type, SUM( resource_amount ) resource_amount
                                            FROM `goods_incoming`
                                            WHERE is_deleted =0
                                            AND is_parent =0
                                            GROUP BY resource_type
                                            UNION
                                            SELECT resource_type, SUM( resource_amount ) * -1 resource_amount
                                            FROM `goods_outgoing`
                                            WHERE is_deleted =0
                                            AND is_parent =0
                                            GROUP BY resource_type"
);
      
$icollection Mage::getModel('goods/goods')->getCollection();
      
$icollection->getSelect()->reset(Zend_Db_Select::FROM)
                  ->
from(array('main_table' => 'goods'),
                         array(
'query' => 'SUM(resource_amount) as resource_amount'))
                  ->
group('resource_type');
      
$this->setCollection($icollection);
      return 
parent::_prepareCollection();
  
}
goods_incoming === tab1
goods_outgoing === tab2
‘goods/goods’ - описана модель этой таблицы goods
 
Magento Community Magento Community
Magento Community
Magento Community
 
TaganPablo
Sr. Member
 
Avatar
Total Posts:  114
Joined:  2009-03-18
Russian Federation, Taganrog
 

Супеееееееер !!! 3 дня маялся с такой же проблемой ! Буржуйский форум не помог (
Спасибо за пост !!!

 
Magento Community Magento Community
Magento Community
Magento Community
Magento Community
Magento Community
Back to top