2010-07-10 25 views
5

ZendFW ile bir sql sorgusu oluşturmaya çalışıyorum, ancak istediğim gibi işlev göremiyorum (veya hiç çalışmıyor). Bu benimZend_Db alt sorgu

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 

Ne çözemiyorum düzgün orada o alt sorgu nasıl olduğunu) (seçmek Zend_Db ile inşa etmeye çalışıyorum ve ben denemek işe yaramış görünmüyor o çalıştığını sorgusu olur.

Herhangi bir yardım çok takdir edilecektir!

Teşekkürler!

Düzenleme/Cevap: aşağıdaki şekilde sorgu tarafından işlenmiş yeniden aşağıya hiç kimse öneri göre benzer bir sorun, olacaksa:

ZendFW kullanarak bu şekilde oluşturulan
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'); 

cevap

5

bir alt sorgu gerekmez, sen GROUP BY ile yapabilirsiniz:

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

Sanırım MySQL kullanıyorsunuz. Grup-by MySQL'in izin vermeyen standart dışı davranışı nedeniyle bu şekilde daha basit.

düzenleme: Yukarıdaki sorguyu, ti için joinLeft()'u kullanmak üzere değiştiriyorum. Bu, yorumunuzda belirttiğiniz gibi, belirli bir hedef için hiçbir davet mevcut değildir. Gerçekten bir alt sorgu kullanmanız gerekiyorsa


, ayrı olarak oluşturabilir ve sonra ana sorgunun seçilen listesine içine interpole edebilirsiniz:

$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 parantez aramaya bilir sütun seçim listenizde adlandırılır ve bu sütunları sınırlamaktan kaçının.

Ayrıca Zend_Db_Select'i kullanmak zorunda olmadığınızı belirtmek isterim. Bu sınıf, değişkenlere veya uygulama mantığına bağlı parçalarla bir sorgu oluşturmaya ihtiyaç duyduğunuzda en iyisidir. Tam SQL sorgusunu biliyorsanız ve uygulama koşullarına bağlı değilse, sadece bir dizede yazmanız daha açıktır - tıpkı orijinal sorunuzda yazdığınız gibi.

+0

Geri bildiriminiz için teşekkürler ve MySQL kullanıyorum, ancak maalesef aradığım sonucu üretmiyor. Her td.ID'nin ilişkili bir ti.destination_id değerine sahip olmadığını ve bunun bir alt sorgu kullanmanın neden daha iyi olduğunu düşündüğümü belirtmeliyim. Herhangi bir fikir? – user387302

+0

Çok teşekkür ederim! Alt sorguda hala doğru sorguyu oluşturuyormuş gibi görünen ama Zend_Db_Select (Zend_Db_Expr kullanmayı denediğimde bile) tarafından sınırlandırılmış yanlışlık var. Ben de bundan vazgeçtim. Ancak önerileriniz sayesinde, alt sorgu gereksinimini ortadan kaldırmak için sorgumu bir leftjoin/groupby kullanmaya yönelttim. Çok teşekkür ederim! Hala uygulama mantığına bağlı olan sorgunun başka bölümleri var, bu yüzden başlamak için zend_db_select kullanmak istedim nedeni budur. – user387302

+0

bu benim için mükemmel çalıştı. Burada "' dizi ("trip_title", "($ subquery)")) 'diziyi ekledim (" trip_title "," (subquery) olarak alt subery) ")) böylece hasta sadece sonucu görüyor – Patrioticcow