Zend_Db子查询

问题描述:

我一直在试图用ZendFW构建一个sql查询,但是我似乎无法像我想要的那样(或者根本就没有)运行它。这是查询的作品,我试图建立与Zend_Db的选择()Zend_Db子查询

SELECT tc.trip_title, td.ID, td.trip_id, 
    (SELECT count(*) FROM 'trips_invites' ti 
    WHERE ti.destination_id=td.ID AND ti.accepted ='NR') AS "pending_invites" 
FROM `trips_current` AS `tc`, `trips_data` AS `td` 
WHERE (tc.ID=td.trip_id) AND (tc.creator_id = '1') 
ORDER BY `trip_id` ASC 

我无法弄清楚是如何正确地获取子查询在那里,并没有我尝试似乎工作。

任何帮助将不胜感激!

谢谢!

编辑/答:如果任何人都曾经有过类似的问题的基础上,建议下面我通过查询下列方式重新加工:

SELECT `tc`.`trip_title`, `td`.`ID`, `td`.`trip_id`, count(TI.ID) 
FROM `trips_current` AS `tc` 
INNER JOIN `trips_data` AS `td` ON td.trip_id = tc.ID 
LEFT JOIN trips_invites AS TI ON ti.destination_id = td.id 
WHERE tc.creator_id = 1 AND ti.accepted='NR' 
GROUP BY td.id 
ORDER BY `trip_id` ASC 

其使用ZendFW我创造了这个办法:

$select = $this->dblink->select() 
->from(array('tc' => 'trips_current'), 
     array('trip_title')) 
->join(array('td' => 'trips_data'), 
'td.trip_id = tc.id',     
     array('ID','trip_id')) 
->joinLeft(array('ti'=>'trips_invites'), 
    'ti.destination_id = td.id', 
    array('COUNT(ti.id)')) 
->where('tc.creator_id =?',1) 
->group('td.id') 
->order('trip_id'); 

你并不需要一个子查询,你可以用GROUP BY做到这一点:

$select = $db->select() 
    ->from(array("tc"=>"trips_current"), array("trip_title")) 
    ->join(array("td"=>"trips_data"), "td.trip_id = tc.ID", array("ID", "trip_id")) 
    ->joinLeft(array("ti"=>"trips_invites"), "ti.destination_id = td.ID", array("COUNT(*)") 
    ->where("tc.creator_id = ?", 1) 
    ->group(array("tc.ID", "td.ID")) 
    ->order("trip_id"); 

我假设你正在使用MySQL。由于MySQL允许的非标准行为,group-by更简单。

编辑:我改变上面的查询使用joinLeft()为ti。这是为了避免给定目的地的邀请,就像你在评论中提到的那样。


如果你确实需要使用子查询,你可以单独创建,然后将其插值到主查询的选择列表:

$subquery = $db->select() 
    ->from(array("ti"=>"trips_invites", "COUNT(*)") 
    ->where("ti.destination_id = td.ID"); 

$select = $db->select() 
    ->from(array("tc"=>"trips_current"), array("trip_title", "($subquery)")) 
    ->join(array("td"=>"trips_data"), "td.trip_id = tc.ID", array("ID", "trip_id")) 
    ->where("tc.creator_id = ?", 1) 
    ->order("trip_id"); 

Zend_Db_Select对象知道如何寻找括号列在您的选择列表中命名并跳过分隔这些列。

另外我想指出,你不必仅仅因为它在那里就使用Zend_Db_Select。当你需要建立一个依赖于变量或应用逻辑的部分的查询时,该类最适合。如果您知道完整的SQL查询,并且它不依赖于应用程序条件,那么只需将它写入字符串就更加清楚 - 就像您在原始问题中写出的一样。

+0

感谢您的反馈,我正在使用MySQL,但不幸的是,这并没有产生我期待的结果。我应该提及,并非每个td.ID都有一个关联的ti.destination_id,我认为这就是为什么我更好地使用子查询。有任何想法吗? – user387302 2010-07-11 02:16:19

+0

非常感谢!我仍然遇到了子查询问题,因为它似乎产生了正确的查询,但被Zend_Db_Select(即使当我尝试使用Zend_Db_Expr)时发生了错误的分隔。所以我放弃了这一点。但是,由于您的建议,我重新修改了查询以使用leftjoin/groupby来避免子查询的需要。非常感谢你! 我仍然有其他部分的查询依赖于应用程序逻辑,这就是为什么我想使用zend_db_select开始。 – user387302 2010-07-11 16:51:44

+0

这对我来说非常完美。这里“'array(”trip_title“,”($ subquery)“))''我添加了'array(”trip_title“,”($ subquery)as subquery“))''这样生病只看到结果 – Patrioticcow 2011-12-09 21:20:34