Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将复杂的SQL查询转换为Zend_Db_Select语句?_Php_Sql_Zend Framework - Fatal编程技术网

Php 如何将复杂的SQL查询转换为Zend_Db_Select语句?

Php 如何将复杂的SQL查询转换为Zend_Db_Select语句?,php,sql,zend-framework,Php,Sql,Zend Framework,MySQL网站具有在数据库中存储分层数据的功能。我正在尝试编写返回节点的直接子节点的查询。我不想只是从MySQL网站复制/粘贴查询,因为我正试图以一种与数据库无关的方式来处理这个问题 这是我正在尝试Zend_Db_Select-ify的查询 SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth FROM nested_category AS node, nested_category AS paren

MySQL网站具有在数据库中存储分层数据的功能。我正在尝试编写返回节点的直接子节点的查询。我不想只是从MySQL网站复制/粘贴查询,因为我正试图以一种与数据库无关的方式来处理这个问题

这是我正在尝试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 object作为from方法的参数,如下所示:

$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`
正如您所看到的,当您添加secondfrom时,它会自动添加内部联接——但我认为,可以将查询重写为用户联接,而不是multi-from语法。所以您应该使用joinInner方法,因为这样您就可以将join条件指定为它的第二个参数

请注意,子查询类似于主查询,因此您可以构建主查询,将其克隆为子查询,并使用Zend_Db_Select方法删除不必要的部分重置方法并替换它们:

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

您可以像这样直接粘贴到查询中

$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将您自己的任何参数输入到此查询中


这有点骗人,我还没有使用过。

+1只是为了链接到教程+1-除了调用Zend_Db_Adapter_Abstract::quoteIdentifier之外,在from中指定AS子句还有更简单的方法吗?说'specify'是指清理?如果是,在创建子查询时,您可以使用命名的绑定参数,例如:nodeName,并在查询执行时绑定它-作为db adapter中fetchAll方法的第二个参数。@singles:否,我的意思是如果表中的一个字段被调用为Left而不是Lft,Lft是SQL保留字。因此,它必须逃脱。例如,在MySQL上它需要变成“左”,而在MSSQL上它需要是[[左]。@Billy ONeal Ohhh,在这种情况下,我不知道除了quoteIdentifier之外的其他方法,对不起:/@Singles:我的意思是就像Zend_Db_Select已经做的那样。也就是说,如果从“MyTable”中执行$x->select->,则数组为“Left”;它逃走了。