2010-07-10 3 views
5

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

То, что я не могу понять, как правильно получить, что подзапрос там, и ничего я стараюсь не похоже на работу.

Любая помощь была бы принята с благодарностью!

Спасибо!

Edit/Ответ: Если кто-то будет когда-либо иметь подобную проблему, основываясь на предположении, ниже я снова работал на запрос следующим образом:

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'); 

ответ

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.

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

+0

Спасибо за отзыв, и я использую MySQL, но, к сожалению, это не дает результат, который я ищу. Я должен упомянуть, что не каждый td.ID имеет связанный ti.destination_id, и я думаю, именно поэтому я лучше использую подзапрос. Есть идеи? – user387302

+0

Большое спасибо! У меня все еще была проблема с подзапросом, поскольку он, казалось, генерировал правильный запрос, но Zend_Db_Select неправильно разделил (даже когда я попытался использовать Zend_Db_Expr). Поэтому я отказался от этого. Но, благодаря вашему предложению, я переработал свой запрос, чтобы использовать leftjoin/groupby, чтобы избежать необходимости в подзапросе. Большое спасибо! У меня все еще есть другие части запроса, которые зависят от логики приложения, поэтому я хотел использовать zend_db_select для начала. – user387302

+0

это работало идеально для меня. здесь "' array ("trip_title", "($ subquery)")) 'i добавил' array ("trip_title", "($ subquery) в качестве подзапроса")) 'так, чтобы увидеть только результат – Patrioticcow

 Смежные вопросы

  • Нет связанных вопросов^_^