您不需要子查询,您可以这样做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 允许非标准行为,分组方式更简单。
edit:我将上面的查询更改为使用joinLeft()
对于钛。正如您在评论中提到的,这是为了防止给定目的地不存在邀请。
如果您确实需要使用子查询,您可以单独创建它,然后将其插入到主查询的选择列表中:
$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 查询并且它不依赖于应用程序条件,那么将其写在字符串中会更清楚 - 就像您在原始问题中写出的那样。