我有一张表,其中包含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,但到目前为止,我得到零结果或表格的全部内容。
安迪
答案 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();
答案 2 :(得分:0)
SELECT p1。* FROM
组成product
p1,product
p2其中p1。CREATED_AT
&gt; p2。CREATED_AT
分组由p2.UID
答案 3 :(得分:0)
您可以使用eloquent
和orderBy()
使用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 BY
和LIMIT
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();