2009-08-18 88 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

相关问题