سؤال

كجزء من تطبيق ويب أكبر (باستخدام CakePHP)، أقوم بتجميع نظام مدونة بسيط.العلاقات بسيطة للغاية:كل مستخدم لديه مدونة، والتي تحتوي على العديد من الإدخالات، والتي تحتوي على العديد من التعليقات.

عنصر أود دمجه هو قائمة "الإدخالات الشعبية". تم تعريف الإدخالات الشعبية على أنها تلك التي لديها معظم التعليقات في الشهر الماضي ، وفي النهاية يجب أن يتم طلبها بعدد التعليقات الحديثة.

من الناحية المثالية، أود أن يبقى الحل ضمن جهاز استرجاع البيانات النموذجي الخاص بـ Cake (Model->find(), الخ)، ولكني لست متفائلا بهذا الشأن.

هل لدى أي شخص حل ذكي/أنيق؟أنا أقوم بتجهيز نفسي لبعض عمليات القرصنة الجامحة لـ SQL لإنجاح هذا العمل ...

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

المحلول

هيه، كنت على وشك العودة بنفس الإجابة بشكل أساسي (باستخدام Cake's Model::find):

$this->loadModel('Comment');

$this->Comment->find( 'all', array(
    'fields' => array('COUNT(Comment.id) AS popularCount'),
    'conditions' => array(
        'Comment.created >' => strtotime('-1 month')
    ),
    'group' => 'Comment.blog_post_id',
    'order' => 'popularCount DESC',

    'contain' => array(
        'Entry' => array(
            'fields' => array( 'Entry.title' )
        )
    )
));

إنها ليست مثالية، ولكنها تعمل ويمكن تحسينها.

لقد قمت بإجراء تحسين إضافي باستخدام السلوك القابل للاحتواء لاستخراج بيانات الإدخال بدلاً من بيانات التعليق.

نصائح أخرى

لا ينبغي أن يكون الأمر سيئًا للغاية، فأنت تحتاج فقط إلى مجموعة حسب (هذا خارج نطاق تفكيري، لذا اعذرني على الأخطاء النحوية):

SELECT entry-id, count(id) AS c 
FROM comment 
WHERE comment.createdate >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) 
GROUP BY entry-id 
ORDER BY c DESC

إذا لم تكن مهتمًا بالطبيعة الحساسة للوقت للتعليقات، فيمكنك الاستفادة من وظيفة counterCache الخاصة بـ CakePHP عن طريق إضافة حقل "comment_count" إلى جدول الإدخالات، وتكوين مفتاح counterCache الخاص بإدخال التعليق الذي ينتمي إلى هذا الحقل، ثم استدعاء find() في نموذج الإدخال.

ربما تريد أ أين شرط للحصول على تعليقات آخر 30 يومًا فقط:

SELECT entry-id, count(id) AS c 
FROM comment 
WHERE comment_date + 30 >= sysdate
GROUP BY entry-id 
ORDER BY c DESC
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top