簡體   English   中英

Zend_Db子查詢

[英]Zend_Db subquery

我一直在嘗試用ZendFW構造一個sql查詢,但是我似乎無法使其功能像我想要的那樣(或根本不起作用)。 這是我嘗試使用zend_db select()構建的查詢

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查詢並且它不依賴於應用程序條件,那么將其寫成字符串就更清楚了-就像您在原始問題中寫出的一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM