2014-09-14 2 views
1

다음 중첩 된 select 문을 CakePHP buildStatement 함수로 수행하려고하는데 아무 소용이 없습니다.CakePHP 중첩 쿼리 : 다른 select 문에서 선택하십시오.

select * from 
(
    select i.id, i.name Item, sum(t.qty) Total, l.name Location 
    from transactions t 
    left join locations l on (l.id = t.location_id) 
    left join items i on (i.id = t.item_id) 
    where t.item_id = 855 
    group by location_id) 
filter where total <> 0 

일부 전문가가이 문제를 해결할 수 있기를 바랍니다.

부끄러워을 시도해보십시오 :

$subqueryOptions = array(
    'fields' => array('Item.id', 'Item.name', 'SUM(Transaction.qty) total', 'Location.name'), 
    'conditions' => array(
     'Transaction.item_id'=>855, 
    ), 
    'joins'=>array(
     'Location', 
     'Item' 
    ), 
    'group'=>array(
     'Transaction.location_id' 
    ), 
    'table'=>'transactions Transaction' 
); 
$db = $this->Transaction->getDataSource(); 
$subQuery = $db->buildStatement($subqueryOptions, $this->Transaction); 
$res = $this->Transaction->find('all', array(
    'fields'=>$subQuery, 
    'conditions' => array('total !='=>0) 
));` 

을 문을 결과 :

SELECT `SELECT Item.id`, `Item`.`name`, SUM(`Transaction`.`qty`) total, `Location.name 
FROM transactions Transaction AS Location Item 
WHERE `Transaction`.`item_id` = 855 
GROUP BY `Transaction`.`location_id`` 
FROM `biruni-inventory`.`transactions` AS `Transaction` 
LEFT JOIN `biruni-inventory`.`transaction_types` AS `TransactionType` 
    ON (`Transaction`.`transaction_type_id` = `TransactionType`.`id`) 
LEFT JOIN `biruni-inventory`.`item_conditions` AS `ItemCondition` 
    ON (`Transaction`.`item_condition_id` = `ItemCondition`.`id`) 
LEFT JOIN `biruni-inventory`.`locations` AS `Location` 
    ON (`Transaction`.`location_id`= `Location`.`id`) 
WHERE `total` != 0 

를 완전히 무관하다!

+0

무엇이 오류입니까? –

+0

남자 나는 심지어 나의 시도를 두는 것을 부끄럽게 생각한다! 편집하고 게시 할 것입니다. – mmahgoub

+0

OK! 나는 내가 여러 가지 잘못을했다고 생각해! 먼저 별명을 잊어 버렸습니다! – mmahgoub

답변

1

이 내가 여기 내 하위 쿼리를 구축하는 케이크를 얻기 위해 할 수있는 최선의 것은 그것입니다 : 같은 결과

$this->loadModel('MyDBSchema.Item'); 
     $db = $this->Transaction->getDataSource(); 
     $db2 = $this->Item->getDataSource(); 
     $subqueryOptions = array(
      'fields' => array('`Item`.`id` Item_id', '`Item`.`name` item_name', 'SUM(`Transaction`.`qty`) total_count', '`Location`.`name` location_name'), 
      'conditions' => array(
       'Transaction.item_id'=>array(855, 901), 
      ), 
      'joins'=>array(
       'left join '.$db->fullTableName($this->Transaction->Location) .' `Location` on (`Location`. `id` = `Transaction`.`location_id`)', 
       'left join ' .$db2->fullTableName($this->Item). ' `Item` on (`Item`.`id` = `Transaction`.`item_id`)', 
      ), 
      'group'=>array(
       'Transaction.location_id' 
      ), 
      'table'=>$db->fullTableName($this->Transaction), 
      'alias'=>'Transaction' 
      ); 

     $subQuery = $db->buildStatement($subqueryOptions, $this->Transaction); 

     $subQueryExpression = $db->expression($subQuery); 

     $mainQueryOptions = array(
      'fields'=>array('item_name','total_count','location_name'), 
      'conditions' => array(
       'total_count <>'=>0, 
      ), 
      'table'=>'('.$subQueryExpression->value.')', 
      'alias'=>'Item' 
      ); 

     $mainQuery = $db->buildStatement($mainQueryOptions, $this->Transaction); 
     $res = $this->Transaction->query($mainQuery); 
     debug($res); die; 

가 :

array( (int) 0 => array( 'Item' => array( 'item_name' => 'الجزيرة.. نظرة رمادية إلى أفريقيا', 'total_count' => '4', 'location_name' => '003-D' ) ), (int) 1 => array( 'Item' => array( 'item_name' => 'أصحاب الحق', 'total_count' => '2', 'location_name' => '003-H' ) ) )

이 나를 위해 잘 작동합니다. 누군가에게 더 나은 해결책이 있다면 알려 주시기 바랍니다.

감사합니다.

+0

감사합니다. 날 구했어! – kicaj

관련 문제