Laravel - 获取每种UID类型的最后一个条目

时间:2018-03-11 06:45:07

标签: laravel eloquent greatest-n-per-group

我有一张表,其中包含100多种不同产品的条目,每种产品都由唯一的UID标识。

ID  UID                 MANY COLUMNS    CREATED AT
2   dqwdwnboofrzrqww1   ...             2018-02-12 01:15:30
4   dqwdwnbsha5drutj5   ...             2018-02-12 01:15:317
6   dqwdwnbvhfg601jk1   ...             2018-02-12 01:15:33

我希望能够获得每个UID的最后一个条目。

np.bincount

这可以在一个数据库调用中实现吗?

我尝试过使用DB和Eloquent,但到目前为止,我得到零结果或表格的全部内容。

安迪

6 个答案:

答案 0 :(得分:3)

这很容易在MySQL中处理:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT UID, MAX(created_at) AS max_created_at
    FROM yourTable
    GROUP BY UID
) t2
    ON t1.UID        = t2.UID AND
       t1.created_at = t2.max_created_at;

将此翻译成Eloquent将是一些工作,但希望这给你一个很好的起点。

修改:如果您希望LEFT JOIN可以created_at 给定的NULL可能,您可能需要使用UID只有空创建的值。

答案 1 :(得分:1)

您可以使用自联接为每个UID选择最新行

select t.*
from yourTable t
left join yourTable t1 on t.uid = t1.uid
and t.created_at < t1.created_at 
where t1.uid is null

使用laravel的查询构建器,它类似于

DB::table('yourTable as t')
    ->select('t.*')
    ->leftJoin('yourTable as t1', function ($join) {
        $join->on('t.uid','=','t1.uid')
             ->where('t.created_at', '<', 't1.created_at');
    })
    ->whereNull('t1.uid')
    ->get();

Laravel Eloquent select all rows with max created_at

Laravel Eloquent group by most recent record

答案 2 :(得分:0)

  

SELECT p1。* FROM product p1,product p2其中p1。CREATED_AT&gt; p2。CREATED_AT分组由p2.UID

组成

答案 3 :(得分:0)

您可以使用eloquentorderBy()使用groupBy()实现此目的:

$data = TblModel::orderBy('id','DESC')->groupBy('uid')->get();

答案 4 :(得分:0)

解决

感谢Tim和M Khalid的回复。它把我带到了正确的道路,但我遇到了障碍,因此我发布了这个解决方案。

这有效:

        $allRowsNeeded = DB::table("table as s")
            ->select('s.*')
            ->leftJoin("table as s1", function ($join) {
                $join->on('s.uid', '=', 's1.uid');
                $join->on('s.created_at', '<', 's1.created_at');
            })
            ->whereNull('s1.uid')
            ->get();

但是我遇到了访问冲突,所以我不得不进入config / database.php并设置

'strict' => false,

在'mysql'配置中,从SQL_MODE中删除ONLY_FULL_GROUP_BY。

再次感谢。

答案 5 :(得分:-1)

您必须使用ORDER BYLIMIT SQL参数,这将引导您轻松获取SQL请求:

例如,在SQL中你应该有这样的东西:

SELECT *
FROM table_name
ORDER BY `created_at` desc
LIMIT 1

这将返回表格中的所有内容。结果将按“created_at”列降序排序。所以第一个结果将是你正在寻找的。然后“LIMIT”告诉只返回第一个结果,所以你不会拥有所有的数据库。

如果您想以雄辩的方式制作它,那么代码就是在做同样的事情:

$model = new Model;
$model->select('*')->orderBy('created_at')->first();