2011-02-03 2 views
2

MySQL 웹 사이트에는 데이터베이스에 계층 적 데이터를 저장하는 경우 excellent tutorial이 있습니다. 노드의 직접적인 자식을 반환하는 쿼리를 작성하려고합니다. 필자는 MySQL의 웹 사이트에서 쿼리를 복사/붙여 넣기하고 싶지 않습니다. 왜냐하면 저는 데이터베이스에 독립적 인 방식으로이 작업을 수행하려고하기 때문입니다. 부모 쿼리 및 하위 쿼리 - 어떻게 복잡한 SQL 쿼리를 Zend_Db_Select 문으로 변환합니까?

SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth 
FROM nested_category AS node, 
    nested_category AS parent, 
    nested_category AS sub_parent, 
    (
     SELECT node.name, (COUNT(parent.name) - 1) AS depth 
     FROM nested_category AS node, 
     nested_category AS parent 
     WHERE node.lft BETWEEN parent.lft AND parent.rgt 
     AND node.name = 'PORTABLE ELECTRONICS' 
     GROUP BY node.name 
     ORDER BY node.lft 
    )AS sub_tree 
WHERE node.lft BETWEEN parent.lft AND parent.rgt 
    AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt 
    AND sub_parent.name = sub_tree.name 
GROUP BY node.name 
ORDER BY node.lft; 
+0

+1 튜토리얼에 대한 링크입니다. – Marcin

답변

1

당신은이 Zend_Db_Select 문에 검색어를 spliting 시도 할 수-쓸어 Zend_Db_Select I가 노력하고있어 쿼리입니다. 아래처럼 from() 방법의 PARAM으로 Zend_Db_Select 객체를 사용할 수 있습니다

$mainQuery = $db->select(); 
$mainQuery->from('user'); 

$sub = $db->select(); 
$sub->from('company'); 

$mainQuery->from(array('subquery' => $sub)); 

그리고 당신은 쿼리의 종류 얻을 것이다 : 당신이 두 번째 추가 할 때

SELECT `user`.*, `sub`.* FROM `user` 
    INNER JOIN (
     SELECT `company`.* FROM `company` 
    ) AS `sub` 

보시다시피, 그것은 자동으로 INNER JOIN 추가를 from() -하지만 제 생각에는 여러 구문 대신 사용자 조인에 쿼리를 다시 작성할 수 있습니다. 따라서 joinInner() 메쏘드를 사용해야합니다. 그 이유는 join 조건을 두 번째 param으로 지정할 수 있기 때문입니다.

$mainQuery = $db->select(); //and rest 
$subQuery = clone $mainQuery; 
$subQuery->reset(Zend_Db_Select::WHERE); 
$subQuery->where(); // and add valid conditions for subquery 
+0

+1 -'Zend_Db_Adapter_Abstract :: quoteIdentifier'를 호출하는 것 외에도'from'에서 AS 절을 지정하는 쉬운 방법이 있습니까? –

+0

살균 소독이란? 그렇다면 하위 쿼리를 만들 때 명명 된 바인드 매개 변수를 사용할 수 있습니다 (예 : ': nodeName' 그리고 질의 실행 순간에 바인드 - db adapter의'fetchAll()'메소드의 두번째 매개 변수. – singles

+0

@singles : 아니, 내 테이블에있는 필드 중 하나가 SQL 예약어 인 "Lft"대신 "Left"라고하면 의미합니다. 따라서 반드시 탈출해야합니다. 예를 들어, MySQL에서는 \\ Left \로 전환해야하지만 MSSQL에서는 [Left]가되어야합니다. –

1

당신을 : 당신이 주요 쿼리를 작성 하위 쿼리로 복제, 감사에 Zend_Db_Select 가능성이 불필요한 부분을 제거 (reset() 방법)하고이를 대체 할 수 있도록

주의, 그 하위 쿼리는 메인 쿼리와 유사하다 그냥이

$result = $db->query("SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth 
     FROM nested_category AS node, 
     nested_category AS parent, 
     nested_category AS sub_parent, 
     (
      SELECT node.name, (COUNT(parent.name) - 1) AS depth 
      FROM nested_category AS node, 
      nested_category AS parent 
      WHERE node.lft BETWEEN parent.lft AND parent.rgt 
      AND node.name = 'PORTABLE ELECTRONICS' 
      GROUP BY node.name 
      ORDER BY node.lft 
     )AS sub_tree 
    WHERE node.lft BETWEEN parent.lft AND parent.rgt 
     AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt 
     AND sub_parent.name = sub_tree.name 
    GROUP BY node.name 
    ORDER BY node.lf"); 

처럼 직접 쿼리에 붙여 넣을 수 있습니다이 쿼리에 입력 자신의 매개 변수 중 하나에 quote()를 사용하십시오.

이것은 약간의 속임수이며 내가 아직 사용하지 않은 것입니다.

관련 문제