簡體   English   中英

構造一個復雜的SQL查詢(或多個查詢)

[英]construct a complex SQL query (or queries)

作為一個較大的Web應用程序(使用CakePHP)的一部分,我正在構建一個簡單的博客系統。 關系非常簡單:每個用戶都有一個Blog,其中包含許多條目,其中包含許多評論。

我要合並的元素是“熱門條目”列表。 流行條目已定義為上個月評論數量最多的條目,最終需要按最近評論的數量進行排序。

理想情況下,我希望解決方案保留在Cake的Model數據檢索設備( Model->find()等)中,但是我對此並不滿意。

任何人都有一個聰明/優雅的解決方案? 我正在為一些瘋狂的SQL黑客而努力,以使這項工作...

嘿,我將要返回的答案基本上是相同的(使用Cake的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' )
        )
    )
));

它不是完美的,但是它可以工作並且可以改進。

我做了進一步的改進,使用Containable行為提取了Entry數據而不是Comment數據。

應該還不錯,您只需要一個分組依據(這是我的主意,因此可以避免語法錯誤):

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

如果您對注釋的時間敏感性本質不感到困惑,則可以通過在條目表中添加“ comment_count”字段,並在此字段中配置“注釋belongsTo Entry”關聯的counterCache鍵,來利用CakePHP的counterCache功能。在Entry模型上調用find()。

您可能希望WHERE子句獲得最近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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM