Вам не нужен подзапрос, вы можете сделать это с помощью 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()
для ti.Это в том случае, если для данного пункта назначения не существует приглашений, как вы упоминаете в своем комментарии.
Если вам действительно нужно использовать подзапрос, вы можете создать его отдельно, а затем интерполировать в select-список вашего основного запроса:
$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-запрос, и он не зависит от условий приложения, более просто записать его в виде строки, как вы писали в исходном вопросе.