5

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

1 に答える 1

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の許容される非標準の動作により、group-byはそのように単純になります。

編集:上記のクエリを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が存在するという理由だけで、Zend_Db_Selectを使用する必要がないことも指摘しておきます。このクラスは、変数またはアプリケーションロジックに依存する部分でクエリを構築する必要がある場合に最適です。完全なSQLクエリを知っていて、それがアプリケーションの条件に依存しない場合は、元の質問で書いたのと同じように、文字列で書き出す方がより明確です。

于 2010-07-11T00:15:44.720 に答える