【问题标题】:Kohana ORM, rewriting an ORDER BY and GROUP BY queryKohana ORM,重写 ORDER BY 和 GROUP BY 查询
【发布时间】:2012-03-04 18:46:42
【问题描述】:

我需要使用 Kohana ORM 从连接到 article.id = message.article_id 的相关表中获取按最新评论排序的文章列表。我设法建立了一个查询,即 GROUPS 然后才 ORDERS:

SELECT * 
FROM  `articles` 
LEFT JOIN  `comments` ON (  `articles`.`id` =  `comments`.`article_id` ) 
GROUP BY  `comments`.`item_id` 
ORDER BY  `datetime` DESC 

我要构建的查询是:

SELECT * FROM `articles` LEFT JOIN 
(SELECT article_id, MAX(datetime) as datetime FROM comments GROUP BY (article_id)) 
AS b ON `articles`.`id` = b.`article_id` 
ORDER BY datetime 

我不知道如何将其重写为 Kohana ORM...(我无法避免 ORM,因为有大量代码依赖它)

【问题讨论】:

    标签: mysql orm kohana


    【解决方案1】:
    $subquery = DB::select('article_id', array('MAX("datetime")','datetime'))
        ->from('comments')
        ->group_by('article_id');
    
    $s = ORM::factory('article')
        ->join(array($subquery, 'b'), 'LEFT')
        ->on('article.id','=','b.article_id')
        ->order_by('datetime')
        ->find_all();
    

    这是您查询的翻译,我不确定它是否有效

    【讨论】:

    • 谢谢老哥,成功了。在我的辩护中,Kohana 文档明确指出 join() 的第一个参数必须是一个字符串,我相信它们)。
    【解决方案2】:
    ORM::factory('article')->join('comments', 'LEFT')->on('article.id', '=', 'comments.article_id')->group_by('comments.id')->order_by('date', 'DESC')->find_all()->as_array();
    

    这会生成 sql 为:

    SELECT article.* FROM articles AS article LEFT JOIN comments 开(article.id = comments.article_id)分组comments.id 通过date DESC 订购

    与您的第一个查询匹配。

    我不确定如何在 ORM 中使用嵌套查询,但 kohana 中有 Query builder 应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      相关资源
      最近更新 更多