我一直在尝试使用ZendFW构建一个sql查询,但我似乎无法让它像我想要的那样运行(或者根本不起作用)。这是我正在尝试使用zend_db select()
构建的查询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');
答案 0 :(得分:5)
您不需要子查询,可以使用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查询并且它不依赖于应用程序条件,那么将其写在字符串中就更清楚了 - 就像您在原始问题中写出的一样。