Bana bir karmaşık SQL sorgu (veya sorguları) inşa Yardım

4 Cevap php

(CakePHP kullanarak) büyük bir web-app parçası olarak, birlikte, basit bir blog sistemi koyuyorum. Ilişkiler son derece basit: her kullanıcı çok Yorumları birçok başlıklar var bir blog vardır.

Ben dahil etmek istediğiniz bir eleman listesi "Popüler Yazılar." Popüler Yazılar geçen ay en Yorumlarla gibi tanımlanmış ve sonuçta onlar son Yorum sayısına göre sipariş edilmesi gerekir.

İdeal olarak, (Model-> (), vb bulabilirsiniz) Cake Model veri alma aparatı içinde kalmak için bir çözüm istiyorum, ama bu konuda iyimser değilim.

Herkes akıllı / zarif bir çözüm var mı? Ben bu işi yapmak için bazı yabani SQL kesmek için kendimi steeling ediyorum ...

4 Cevap

Heh, ben (Cake Model :: bulmak kullanarak) esasen aynı cevabı ile geri gelmek üzereydim:

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

O mükemmel değil, ama o inşaat ve geliştirilebilir.

Ben Giriş verileri yerine Açıklama veri ayıklamak için Containable davranışı kullanarak, ek bir iyileştirme yaptı.

Çok kötü olmamalı, sadece bir grup gerekir (bu benim kafa tipi kapalı, yani sözdizimi hataları affet):

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

Eğer yorumların zaman hassas doğası hakkında fussed olsaydı, o zaman, bu alanla Yorum belongsTo Giriş dernek counterCache anahtarını yapılandırmak, girişleri tabloya "COMMENT_COUNT" alanını ekleyerek CakePHP'nin counterCache işlevselliği faydalanmak olabilir Giriş modeli üzerinde () bulabilirsiniz diyoruz.

Muhtemelen sadece son 30 gün yorumlarını almak için nereye fıkra istiyorum:

SELECT entry-id, count(id) AS c FROM comment WHERE comment_date + 30 >= sysdate GROUP BY entry-id ORDER BY c DESC