سؤال

أريد أن تظهر عدد التعليقات لكل بلوق وظيفة (جنبا إلى جنب مع الفئة والتاريخ المؤلف إلخ) على صفحة يحتوي على قائمة من بلوق وظائف.كيف أكتب التالي الاستعلام الخلية في دفع?

SELECT post.id, post.title, post.more_columns , COUNT(comments.post_id) AS numofcomments FROM post INNER JOIN comments ON post.id = comments.post_id GROUP BY post.id, post.title, post.more_columns

حيث نشر المدونة في الجدول و تعليقات جدول التعليقات مع post_id أجنبية مفتاح آخر.id.أنا غير قادر على الحصول على ما يبدو 'numofcomments' كما عمود في resultset.حاليا أنا أستخدم غير ORM النهج (الذي سيكون الملاذ الأخير):

$con = Propel::getConnection(PostPeer::DATABASE_NAME);

    $sql = "SELECT post.* , COUNT(comments.post_id) AS numcomments FROM post INNER JOIN comments ON post.id = comments.post_id GROUP BY post.id";  
    $stmt = $con->prepare($sql);
    $stmt->execute();

    $result = PostPeer::populateObjects($stmt);
    return $result;

كيف يمكنني الوصول إلى 'numofcomments' في الناتج دفع resultset?

تحرير:ما أريد أن أعرفه هو كيف يمكن كتابة الاستعلام أعلاه في دفع?ما يمكنني القيام به الآن هو الحصول على وظيفة الجدول مع inner join على التعليقات الجدول ثم قم بتشغيل doCount على التعليقات الجدول لكل وظيفة-id.هذه النتائج في 1 الاستعلام عن وظيفة الجدول و العديد من الاستفسارات عن التعليقات الجدول.أتمنى للحد من استعلامات sql إلى الحد الأدنى.شكرا :)

هل كانت مفيدة؟

المحلول 4

حسنا هذا هو ما عملت ولكن حزين طريقة للقيام بذلك :|

//inside a static function in class PostPeer:
$c = new Criteria();
self::addSelectColumns($c); //add all columns from PostPeer
$c->addJoin(PostPeer::ID, CommentPeer::POST_ID, Criteria::LEFT_JOIN);
$cu->addAsColumn('numofcomments', 'COUNT('.CommentPeer::POST_ID.')');
$cu->addGroupByColumn(PostPeer::ID);
$cu->addGroupByColumn(PostPeer::TITLE);
:
:
//more group-by columns if needed
return PostPeer::doSelectStmt($c);

ثم في قالب يمكنني الوصول إلى مجموعة:

<div id="title">
   <?php echo post_array[1] ?>
</div>
//...and so on for other Post fields

كيف يمكنني جعل مجموعة الرابطة في النموذج بحيث أستطيع أن أكتب "post_array['title']" في قالب بدلا من "post_array[1]"?أيضا ، هو هذا الحل آمنة ؟ أي أفضل اقتراح.أنا باستخدام دفع 1.3

نصائح أخرى

SELECT post.* , COUNT(comments.post_id) AS numcomments FROM post INNER JOIN comments ON post.id = comments.post_id GROUP BY post.id,post.secondcol,post.thirdcol; و حتى على مجرد سرد كافة الأعمدة الفردية في آخر الجدول ، حيث حدد آخر.*, عليك أن قائمة لهم جميعا ، وليس مجرد وظيفة.post_id.

Alternativly

SELECT post.*,sub.numcomments from post,
(select post.post_id as post_id,COUNT(comments.post_id) AS numcomments 
   FROM post INNER JOIN comments ON post.id = comments.post_id GROUP BY post.id) as sub
   where post.post_id = sub.post_id;

(هناك 3.و أسهل طريقة حسنا ، لقد نسيت الآن..)

إذا كنت ترغب في حزمة بيانات إضافية في الأشياء الخاصة بك التي يتم إرجاعها بواسطة استعلام مخصص, يمكنك تجاوز الافتراضي doSelect (طريقة) في نظير فئة إضافة هذه البيانات الإضافية من الاستعلام الخاص بك في كل كائن التي يتم إرجاعها.

في مشاركاتك الدرجة ، يمكنك إضافة حماية متغير, دعنا نسميها "numComments".

class Post extends BasePost {
  protected $numComments;

  public function setNumComments($v)
  {
    $this->numComments = $v;
  }

  public function getNumComments()
  {
    return $this->numComments;
  }
  ...
}

ثم في PostPeer الدرجة في ثابت doSelectWithCount() الطريقة:

public static function doSelectWithCount() {
  $c = new Criteria();
  self::addSelectColumns($c); //add all columns from PostPeer
  $c->addAsColumn('numofcomments', 'COUNT('.CommentPeer::POST_ID.')');
  $c->addJoin(PostPeer::ID, CommentPeer::POST_ID, Criteria::LEFT_JOIN);
  $c->addGroupByColumn(PostPeer::ID);
  $c->addGroupByColumn(PostPeer::TITLE);
  // ...
  // more group-by columns if needed
  $rs = PostPeer::doSelectRS($c);

  $posts = array();
  while ($rs->next()) {
    $post = new Post();
    $post->hydrate($rs);
    $post->setNumComments($rs->getInt(PostPeer::NUM_COLUMNS + 1));
    $posts[] = $post;
  }

  return $posts;
}

هنا هو دفع إصدار استعلام sql.

$c = new Criteria();
// count comments with 
$c->addAsColumn('numofcomments', 'COUNT('.CommentPeer::POST_ID.')');
$c->addJoin(PostPeer::ID, CommentPeer::POST_ID, Criteria::LEFT_JOIN);
$c->addGroupByColumn(PostPeer::ID);
$c->addGroupByColumn(PostPeer::TITLE);
// you can add more groupby column here
//$c->addGroupByColumn(...more);
$this->posts = PostPeer::doSelect($c);

يجب عليك استخدام اليسار الانضمام بدلا الداخلية الانضمام.لأن.مع inner join يمكنك فقط الوصول إلى الوظائف الأقل تعليق واحد.مع ترك الانضمام يمكنك تحديد uncommented الوظائف.

آمل أن يساعد هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top