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查询,并且它不依赖于应用程序条件,那么只需将它写入字符串就更加清楚 - 就像您在原始问题中写出的一样。
感谢您的反馈,我正在使用MySQL,但不幸的是,这并没有产生我期待的结果。我应该提及,并非每个td.ID都有一个关联的ti.destination_id,我认为这就是为什么我更好地使用子查询。有任何想法吗? – user387302 2010-07-11 02:16:19
非常感谢!我仍然遇到了子查询问题,因为它似乎产生了正确的查询,但被Zend_Db_Select(即使当我尝试使用Zend_Db_Expr)时发生了错误的分隔。所以我放弃了这一点。但是,由于您的建议,我重新修改了查询以使用leftjoin/groupby来避免子查询的需要。非常感谢你! 我仍然有其他部分的查询依赖于应用程序逻辑,这就是为什么我想使用zend_db_select开始。 – user387302 2010-07-11 16:51:44
这对我来说非常完美。这里“'array(”trip_title“,”($ subquery)“))''我添加了'array(”trip_title“,”($ subquery)as subquery“))''这样生病只看到结果 – Patrioticcow 2011-12-09 21:20:34