如何将复杂的 SQL 查询转换为 Zend_Db_Select 语句? [英] How does one convert complex SQL queries into Zend_Db_Select statements?

查看:28
本文介绍了如何将复杂的 SQL 查询转换为 Zend_Db_Select 语句?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

MySQL 网站有一个关于存储分层数据的优秀教程在一个数据库中.我正在尝试编写返回节点的直接子节点的查询.我不想只是从 MySQL 网站复制/粘贴查询,因为我正在尝试以与数据库无关的方式处理此问题.

The MySQL website has an excellent tutorial on storing hierarchal data in a database. I'm trying to write the query that returns a node's immediate children. I don't want to just copy/paste the query from the MySQL website, because I'm trying to work on this in a database agnostic manner.

这是我正在尝试 Zend_Db_Select-ify 的查询

This is the query I'm trying to 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;

推荐答案

您可以尝试将查询拆分为两个 Zend_Db_Select 语句 - 父查询和子查询.您可以使用 Zend_Db_Select 对象作为 from() 方法的参数,如下所示:

You can try spliting your query into two Zend_Db_Select statements - parent query and subquery. You can use Zend_Db_Select object as param of from() method, like below:

$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`

如您所见,当您添加第二个 from() 时,它会自动添加 INNER JOIN - 但我认为,可以将您的查询重写为用户连接而不是多从语法.所以你应该使用 joinInner() 方法,因为这样你就可以指定连接条件作为它的第二个参数.

As you see, it automatically adds INNER JOIN when you add second from() - but I think, it's possible to rewrote your query to user joins instead of multi from syntax. So you should use joinInner() method, because then you can specify join condition as second param of it.

注意,该子查询类似于主查询,因此您可以构建主查询,将其克隆为子查询,并感谢 Zend_Db_Select 可能性删除不必要的部分(reset() 方法)并替换它们:

Notice, that subquery is similar to main query, so you could build main query, clone it as subquery, and thanks to Zend_Db_Select possibilities remove unnecessary parts (reset() method) and replace them:

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

这篇关于如何将复杂的 SQL 查询转换为 Zend_Db_Select 语句?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆