Ben Zend_Db_Select kullanarak bu yazabiliriz?

1 Cevap php

Ben aşağıdaki sorgu yazmak gerekiyor:

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)

Benim için işi yapmak için kimseye sormuyorum. Ben sadece bu gibi bir sorgu yapabileceğini referans şey bulamadı. Doğru yönde bana gelin ve ben gereken her şeyi olmalıdır.

Ben alt sorgu gereken noktaya alabilirsiniz, sonra ilerleme nasıl hiçbir fikrim yok. Herhangi bir fikir?

Bilginize: Ben Zend_Paginator bunu yolluyorum, çünkü bir Zend_Db_Select nesnesini kullanmak istiyorum

Sorgu ne yaptığını Açıklanması: verilen bir forum kategorisinde tüm konuları çekerek uzun bir ilk yazının içeriği ile.

1 Cevap

Ben Zend için çalışırken ben de ben dokümanlar ve birim testleri yazdı, Zend_Db_Select bir çok geliştirdi.

Benim her zamanki tavsiyem Zend_Db_Select olduğunu you don't have to use it. Bu needs parça bir sorgu parça oluşturmak için karmaşık uygulama mantığı varsa kullanılacak anlatıyor. Zaten tam bir SQL sorgusu biliyorsanız, sadece bir dize olarak yürütmek ve tüm Zend_Db_Select kullanmayın çok daha kolay.

Ama sorgu cevaplamak için, aşağıda bir çözüm bulunur.

Bir alt sorgu gerekmez böylece ben sorgu değişti. Ben başka hiçbir önceki mesajımızı p2 aynı thread_id ile olan yazı p maç için LEFT JOIN ile bir hile kullanıyorum. Bu vardı sorgu fikir daha verimli olmalıdır.

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

Bu test ve şu çıkışı vardır:

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)