Laravel 4查询构建器 - 按最大日期分组

3

一个小查询问题,我有一张表:

id    | user_id | paper_update
------------------------------
1     |    1    | 30-5-2011
2     |    2    | 30-5-2012
3     |    3    | 30-5-2012   
4     |    1    | 30-5-2013  
5     |    2    | 30-5-2013  
6     |    3    | 30-5-2014  
7     |    4    | 30-5-2014  
8     |    5    | 30-5-2014
9     |    5    | 30-5-2015 
10    |    5    | 30-5-2016
11    |    1    | 30-5-2010
-------------------------------

我想要做的是仅选择user_id相同的记录中paper_update最大的记录,实际上我想按user_id分组,以便得到最大的paper_update。 对于这张表,将返回以下内容:

id    | user_id | paper_update
------------------------------
4     |    1    | 30-5-2013  
5     |    2    | 30-5-2013  
6     |    3    | 30-5-2014  
7     |    4    | 30-5-2014  
10    |    5    | 30-5-2016 
-------------------------------

请重新表达问题,它不够清晰。 - The Alpha
尝试执行 SELECT * FROM table GROUP BY user_id HAVING(MAX(paper_update)) - Sam
@SamD 我已经尝试过了,但无效。 - Siamak Motlagh
很遗憾,我这里没有安装数据库。你可以尝试这个查询语句:select * from user where (parse_Date, user_id) = (select max(parse_date), user_id from user group by user_id)。 - CuriousMind
3个回答

10

这是在 Laravel 中获取 groupBy 最大日期的最简单和最短的方法。使用 group by user_id 来获取最大日期的行。

       $rows = DB::table('papers')
               ->select(DB::raw('id, max(paper_update) as year,user_id'))
               ->groupBy('user_id')
               //->orderBy('paper_update', 'desc')
               ->get();

这个 Laravel 查询将创建一个类似于以下的 MySQL 查询

select id, max(paper_update) as year from `papers` group by `user_id`;

输出结果将是:

Array
(
    [0] => stdClass Object
        (
            [id] => 4
            [year] => 30-5-2013 
            [user_id] => 1
        )

    [1] => stdClass Object
        (
            [id] => 5
            [year] => 30-5-2013
            [user_id] => 2
        )

    [2] => stdClass Object
        (
            [id] => 6
            [year] => 30-5-2014
            [user_id] => 3
        )

    [3] => stdClass Object
        (
            [id] => 7
            [year] => 30-5-2014
            [user_id] => 4
        )
    [4] => stdClass Object
        (
            [id] => 10
            [year] => 30-5-2016
            [user_id] => 5
        )
)

3

MySQL:

您可以使用Left Join来避免使用Group By,以检索每个user_id的最后一个paper_update

SELECT t1.*
FROM paper AS t1 LEFT JOIN paper AS t2
ON (t1.user_id = t2.user_id AND t1.paper_update < t2.paper_update)
WHERE t2.paper_update IS NULL;

假设您的表名为paper查看示例 Laravel查询构建器 : 我不是Laravel查询构建器的专家,但您可以尝试这样做:
$result = DB::table('paper AS t1')
->select('t1.*')
->leftJoin('paper AS t2', function( $join ){
    $join->on( 't1.user_id', '=', 't2.user_id' );
    $join->on( 't1.paper_update', '<', 't2.paper_update' );
})
->whereNull('t2.paper_update')
->get();

2

如果您不熟悉 Laravel 的查询构建器,但是在普通的 MySQL 中,您可以使用来自同一表的最大日期值进行自连接。

select t.*
from t 
join (
  select `user_id`, max(`paper_update`)`paper_update`
  from t group by `user_id`
  ) t1
using(`user_id`, `paper_update`)

Fiddle Demo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接