2009-08-18 18 views
1

私は、次のクエリを記述する必要があります。Zend_Db_Selectを使ってこれを書き直すことはできますか?

SELECT forum_threads.id AS id_thread, 
forum_threads.topic, 
forum_threads.date_created, 
forum_posts.content, 
CONCAT(users.first, ' ', users.last) AS author_name 
    FROM forum_threads,forum_posts,users 
    WHERE forum_threads.category_id=1 
     AND forum_threads.author_id=users.id 
     AND forum_posts.id= 
      (SELECT id FROM forum_posts WHERE thread_id=`id_thread` ORDER BY date_posted ASC LIMIT 0,1) 

私は私のために仕事をする人を求めていませんよ。私はちょうどこのようなクエリを行うことができるリファレンスで何も見つけることができませんでした。私に正しい方向を向けると、それが私が必要とするすべてのものになるはずです。

私はサブクエリに必要なところまで到達することができます。次に、どのように進歩するか分かりません。何か案は? FYI

:最初のコンテンツに長い与えられたフォーラムのカテゴリのすべてのスレッドを引っ張る:私は、クエリが何をしているかのZend_Paginator

解明に送信していますので、私はZend_Db_Selectオブジェクトを使用したいです役職。

+0

を、Zend_Paginatorは今、そのようなアレイますので、ドンなどの他のアダプタをサポートしていますZend_Db_Selectオブジェクトが必要です:) – Julian

答えて

5

私はZendのために働いていた間に多くのZend_Db_Selectを開発しましたが、ドキュメントと単体テストも書きました。

Zend_Db_Selectと私の通常のアドバイスはです。を使用する必要はありません。これは、複雑なアプリケーションロジックがある場合に、にはが必要です。完全なSQLクエリを既に知っている場合は、単に文字列として実行するほうがはるかに簡単で、Zend_Db_Selectはまったく使用しないでください。

しかし、あなたの質問に答えるために、以下の解決策が含まれています。

サブクエリを必要としないようにクエリを変更しました。私はLEFT JOINのトリックを使用して、p2と同じthread_idの他の以前の投稿がない投稿pにマッチさせています。これは、あなたが持っているサブクエリの考えよりも効率的でなければなりません。

$select = $db->select() 
->from(array('t'=>'forum_threads'), array('id_thread'=>'id', 'topic', 'date_created')) 
->join(array('p'=>'forum_posts'), 't.id=p.thread_id', array('content')) 
->joinLeft(array('p2'=>'forum_posts'), 
    't.id=p2.thread_id AND p.id > p2.id', array()) 
->join(array('u'=>'users'), 't.author_id = u.id', 
    array('author_name'=>new Zend_Db_Expr("CONCAT(u.first, ' ', u.last)"))) 
->where('t.category_id = 1') 
->where('p2.id IS NULL'); 

私はこれをテストし、それが次の出力があります。私はこの質問は古いですが、念のために誰もが、まだこれを読んでいる知っている

SELECT `t`.`id` AS `id_thread`, `t`.`topic`, `t`.`date_created`, `p`.`content`, 
    CONCAT(u.first, ' ', u.last) AS `author_name` 
FROM `forum_threads` AS `t` 
INNER JOIN `forum_posts` AS `p` ON t.id=p.thread_id 
LEFT JOIN `forum_posts` AS `p2` ON t.id=p2.thread_id AND p.id > p2.id 
INNER JOIN `users` AS `u` ON t.author_id = u.id 
WHERE (t.category_id = 1) AND (p2.id IS NULL) 
+0

詳細な回答ありがとうございます。私は通常、Zend_Db_Selectを正直に使ってはいませんが、ページ設定にはページ設定を行うために、ページセレクトオブジェクトが必要です。 –

+0

Btw、私は、 'date_created'が重複していれば、一番早いと思われる複数の行を得ることができるということに気付きました。年代順に対応するp.idの順序に頼ることができれば、それを代わりに使用して、結びつきの可能性を避けることができます。 –

+0

私は 'p2'の結合条件を編集して、私が意味することを示しました。 –

関連する問題