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

2019-05-12 13:36发布

我有一个具有条目100的超过1000种不同的产品,每一个唯一的UID标识的表。

ID  UID                 MANY COLUMNS    CREATED AT
1   dqwdwnboofrzrqww1   ...             2018-02-11 23:00:43
2   dqwdwnboofrzrqww1   ...             2018-02-12 01:15:30

3   dqwdwnbsha5drutj5   ...             2018-02-11 23:00:44
4   dqwdwnbsha5drutj5   ...             2018-02-12 01:15:31

5   dqwdwnbvhfg601jk1   ...             2018-02-11 23:00:45
6   dqwdwnbvhfg601jk1   ...             2018-02-12 01:15:33

...

我希望能够得到每个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

这可能在一个数据库调用?

我一直在使用DB以及雄辩的尝试,但到目前为止,我要么得到结果为零或表的全部内容。

安迪

Answer 1:

这是很容易在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;

这个翻译过来雄辩是一些工作,但希望这给你一个很好的起点。

编辑:您可能需要使用LEFT JOIN如果预计created_at可能永远不会NULL 一个给定的UID或许只空创造的价值。



Answer 2:

您可以使用自联接挑选最新行对每个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雄辩选择具有最大created_at所有行

Laravel雄辩组的最新记录



Answer 3:

SELECT P1。* FROM product P1, product P2其中,P1。 CREATED_AT > P2。 CREATED_AT通过p2.UID组



Answer 4:

你可以做到这一点eloquent使用orderBy()groupBy()

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


Answer 5:

解决了

感谢Tim和M哈立德对他们的答复。 我花了降权的道路,但我遇到了障碍,因此为什么我张贴这种解决方案。

这工作:

        $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。

再次感谢。



Answer 6:

你必须使用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();


文章来源: Laravel - Get the last entry of each UID type