我有一个具有条目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以及雄辩的尝试,但到目前为止,我要么得到结果为零或表的全部内容。
安迪
这是很容易在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
或许只空创造的价值。
您可以使用自联接挑选最新行对每个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雄辩组的最新记录
SELECT P1。* FROM product
P1, product
P2其中,P1。 CREATED_AT
> P2。 CREATED_AT
通过p2.UID组
你可以做到这一点eloquent
使用orderBy()
和groupBy()
$data = TblModel::orderBy('id','DESC')->groupBy('uid')->get();
解决了
感谢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。
再次感谢。
你必须使用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();