2010-07-10 5 views
5

ZendFW를 사용하여 SQL 쿼리를 작성하려고했지만 기능이 제대로 작동하지 않는 것처럼 보입니다. 이것은 내가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 

은 내가 알아낼 수 없습니다가 제대로 거기에 그 하위 쿼리를 얻는 방법입니다) (선택 zend_db과 구축을 위해 노력하고있어, 나는 시도 아무것도 작동하는 것 같다 없다 작동하는 쿼리입니다.

도움이 될 것입니다.

감사합니다.

편집/답변 : 나는 다음과 같은 방법으로 쿼리-일 다시 아래 누구도 제안에 따라 유사한 문제가 발생하는 경우 :

ZendFW를 사용하여 나는이 길을 만들어
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 

:

$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"); 
,536,

MySQL을 사용하고 있다고 가정합니다. group-by는 MySQL의 허용되지 않는 비표준 동작 때문에 더 간단합니다.

편집 : 위의 쿼리는 ti에 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 쿼리를 알고 있고 응용 프로그램 조건에 의존하지 않는다면 원래 질문에서 썼던 것처럼 문자열로 작성하는 것이 더 분명합니다.

+0

의견을 보내 주셔서 감사 드리며, MySQL을 사용하고 있습니다 만, 불행히도 내가 찾고있는 결과가 나오지 않습니다. 모든 td.ID에는 ti.destination_id가 관련되어있는 것은 아니며 하위 쿼리를 사용하는 것이 더 좋습니다. 어떤 아이디어? – user387302

+0

대단히 고마워요! 나는 여전히 하위 쿼리에 문제가 있었지만 올바른 쿼리를 생성하는 것으로 보였지만 Zend_Db_Expr을 사용하여 시도했을 때조차도 Zend_Db_Select에 의해 잘못 구분되었습니다. 그래서 나는 그것을 포기했다. 하지만 귀하의 제안 덕분에 하위 쿼리가 필요하지 않게하기 위해 leftjoin/groupby를 사용하는 쿼리를 수정했습니다. 고마워요! 여전히 애플리케이션 로직에 의존하는 쿼리의 다른 부분이 있는데, 이는 내가 zend_db_select를 사용하여 시작하고 싶었던 이유입니다. – user387302

+0

이것은 나를 위해 완벽하게 작동했습니다. array ("trip_title", "($ subquery)"))''array ("trip_title", "($ subquery) as subquery"))'결과를보기 위해서 – Patrioticcow