Я пытался создать запрос SQL с ZendFW, но я, может казаться, не заставляю его функционировать как, я хочу к (или функция вообще). Это - запрос, который работает, который я пытаюсь создать с выбором 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.
редактировать: Я изменяю приведенный выше запрос, чтобы использовать 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-запрос и он не зависит от условий приложения, будет более понятным просто записать его в строку - точно так же, как вы написали в своем исходном вопросе.