2011-02-03 49 views
2

MySQL网站在将分层数据存储在数据库中时有一个excellent tutorial。我试图编写返回节点的直接子节点的查询。我不想从MySQL网站复制/粘贴查询,因为我试图以数据库不可知的方式处理这个问题。如何将复杂的SQL查询转换为Zend_Db_Select语句?

这是我想查询Zend_Db_Select对象,IFY

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 2011-02-03 08:37:55

回答

1

您可以尝试劈裂查询分为两个Zend_Db_Select语句 - 父查询和子查询。您可以使用Zend_Db_Select对象from()方法PARAM,象下面这样:

$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()方法,因为你可以指定连接条件作为它的第二参数。

注意,子查询类似于主查询,所以你可以建立主查询,复制它的子查询,并感谢Zend_Db_Select可能性删除不需要的部分(reset()法)和替换它们:

$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子句吗? – 2011-02-03 16:16:56

1

你可以直接粘贴在查询中直接这样

$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()输入任何自己的参数到该查询。

这是一个作弊,不是我已经采取的行动。