2012-04-13 2 views
1

어떻게이 쿼리를 Zend_Db_Select 개체로 작성할 수 있습니까?Zend_Db_Select UNION 및 IN 연산자로 쿼리

SELECT 
    `v1`.`id`, 
    `v1`.`title`, 
    `v1`.`duration`, 
    `v1`.`img` 
FROM 
    `videos` AS `v1` 
WHERE 
    v1.id IN (
     SELECT id_video FROM videos_categories WHERE id_video NOT IN(
      select id_video from videos_categories where id_category=34 
      UNION 
      select id_video from videos_categories where id_category=20 
     ) 
    ) 

나는 이런 식으로 시도했지만 아무 것도 작동하지 않습니다. 오류 페이지가 있습니다. 데이터 맵퍼를 사용합니다.

$objQuery = $this->getDbTable()->select() 
    ->from(array('v'=>'videos'),array('v.id','v.title','v.duration','v.img')) 

$tableVC1 = new Application_Model_DbTable_VideosCategories(); 
$tableVC2 = new Application_Model_DbTable_VideosCategories(); 
$tableVC3 = new Application_Model_DbTable_VideosCategories(); 
$tableVC4 = new Application_Model_DbTable_VideosCategories(); 

// select id_video from videos_categories where id_category=20 
$tableVC4->select()->from(array("vc"=>"videos_categories"),array("id_video")) 
    ->where("vc.id_category=20"); 

// select id_video from videos_categories where id_category=34 
$tableVC3->select()->from("videos_categories","id_video") 
    ->where("id_category=34"); 

// union between previous queries 
$tableVC2->select()->union(array($tableVC4,$tableVC3)); 

$tableVC1->select()->from("videos_categories","id_video") 
    ->where("id_video NOT IN ?",$tableVC2); 

$objQuery->where("v.id IN ?",$tableVC1); 

Thx 나를 도와줍니다.

+0

어떤 유형의 "오류 페이지"가 ​​있습니까? – Liyali

+0

응용 프로그램 오류 ... 아무것도 표시되지 않습니다. $ objQuery -> __ toString()을 다시 시도했지만 아무 것도 표시하지 않았습니다. –

답변

1

내 생각 엔 당신이 노력하고 있다는 것입니다 문자열을 기대할 때 객체를 노조에 보냅니다.

이 시도 :

$objQuery = $this->getDbTable() 
       ->select() 
       ->from(array('v' => 'videos'), 
         array('v.id', 'v.title', 'v.duration', 'v.img')) 

$tableVC1 = new Application_Model_DbTable_VideosCategories(); 
$tableVC2 = new Application_Model_DbTable_VideosCategories(); 
$tableVC3 = new Application_Model_DbTable_VideosCategories(); 
$tableVC4 = new Application_Model_DbTable_VideosCategories(); 

// select id_video from videos_categories where id_category=20 
$select4 = $tableVC4->select() 
        ->from(array("vc" => "videos_categories"), 
          array("id_video")) 
        ->where("vc.id_category=20"); 

// select id_video from videos_categories where id_category=34 
$select3 = $tableVC3->select() 
        ->from("videos_categories", "id_video") 
        ->where("id_category=34"); 

// union between previous queries 
$select2 = $tableVC2->select() 
        ->union(array($select4, $select3)); 

$select1 = $tableVC1->select() 
        ->from("videos_categories", "id_video") 
        ->where("id_video NOT IN ?", $select2); 

$objQuery->where("v.id IN ?", $select1); 

echo $objQuery;해야 출력이 예상되는 쿼리를.

+0

Thx Liyali !!! 그것은 작동합니다 ... 왜 지금 작동하는지 제발 설명해 주시겠습니까? 같은 select를 $ select에 전달합니다. –

+0

'$ select [1 | 2 | 3 | 4]'는'Zend_Db_Select'의 인스턴스이며,'__toString()'메소드를 구현합니다. '$ tableVC1'을 공용체 (또는 where 절)에 직접 전달하면 이는 'Application_Model_DbTable_VideosCategories'의 인스턴스를 전달하려고한다는 것을 의미합니다. – Liyali

0

? 주위에 대괄호를 사용해야합니다. => (?) ... 변수가 선택 객체 여야합니다.

$tableVC2 = $xyz->select()... 

$tableVC1->select()->from("videos_categories","id_video") 
     ->where("id_video NOT IN (?)",$tableVC2); 
+0

시도했지만 작동하지 않습니다. –

+0

다른 답변을 게시했는데, 아마도 이것이 도움이됩니다. – ryu

0

이 모델없이,이처럼 SELECT 문을 구축하십시오 - 그것은 이런 식으로 작동합니다 :이 줄 예를 들어

$db = Zend_Db_Table::getDefaultAdapter(); 
$select = $db->select() 
    ->from(
     // base table 
    ) 
    ->joinLeft(
     // join sth 
    ) 
    ->where('x = ?', $x) 
    ->where('y = ?', $y) 
    ->order('z DESC') 
    ->limit(10, 0); 
$q = $db->query($select); 
$rowSet = $q->fetchAll(); 
+0

나는 1 백만개 이상의 레코드 데이터베이스를 가지고 있는데 문제는 UNION과 IN 연산자가 필요하다는 것인데, 같은 쿼리는 IN과 UNION 만 0,020 초로 2 분이 걸린다. –

+0

나는 조인을 사용해야 함을 의미하지는 않는다. 나는 당신이이 성질의 성명서를 사용해야한다는 것을 의미했습니다. 이렇게하면 다른 select 문의 where 메서드 호출 내에서 변수 $ select (전체 선택 개체)를 사용할 수 있습니다. 모델을 가지고 할 경우 Zend는 내 경험으로 테이블 제한에 대해 불평합니다. – ryu