2009-08-18 83 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 2011-04-29 18:26:14

回答

5

我在爲Zend工作的同時開發了很多Zend_Db_Select,以及我編寫的文檔和單元測試。

我通常的建議Zend_Db_Select你不必使用它。當你有複雜的應用程序邏輯需要使用它時,需要逐個構建查詢。如果您已經知道完整的SQL查詢,那麼只需將其作爲字符串執行並且完全不使用Zend_Db_Select

但爲了回答您的問題,我在下面列出了一個解決方案。

我改變了查詢,以便它不需要子查詢。我使用LEFT JOIN的技巧來匹配p的帖子,該帖子沒有其他早期帖子p2thread_id。這應該比你有的子查詢想法更有效率。

$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,但分頁程序需要那個或一個tableselect對象來爲我做分頁。 – 2009-08-18 17:15:28

+0

順便說一句,我意識到有一個問題,如果'date_created'重複,你可能會得到不止一行似乎是最早的。如果您可以依賴與時間順序相對應的p.id順序,則可以使用它來避免關係的可能性。 – 2009-08-18 17:22:17

+0

我已經編輯了'p2'的連接條件來展示我的意思。 – 2009-08-18 17:24:45

相關問題