Php 如何将复杂的SQL查询转换为Zend_Db_Select语句?
MySQL网站具有在数据库中存储分层数据的功能。我正在尝试编写返回节点的直接子节点的查询。我不想只是从MySQL网站复制/粘贴查询,因为我正试图以一种与数据库无关的方式来处理这个问题 这是我正在尝试Zend_Db_Select-ify的查询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
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”;它逃走了。