我确实有一张桌子,里面有多个访客。在我的结果列表中,只应显示每个访问者的最后一次访问。
该表看起来像:
id | created_at | descr | website | source
------------------------------------------
2 | 2017_12_22 | john | john1.com | a
3 | 2017_12_23 | marc | ssdff.com | b
4 | 2017_12_24 | john | john1.com | c
5 | 2017_12_24 | tina | def.com | b
6 | 2017_12_25 | stef | abc.com | a
7 | 2017_12_26 | john | john2.com | c
如果我做一个
->orderBy('visitors.created_at', 'desc')
->groupBy('visitors.descr')
结果列表是正确的,因为每个访问者只显示一次。但我需要访问者的最新出现,并且结果列表显示第一次出现。所以我想看到 ID 7 而不是 ID 2。
以下查询解决了该问题:
select *
from visitors as v
INNER JOIN ( select descr , MAX(created_at) as max_created
from visitors as v
group by descr ) AS M
where v.descr = M.descr AND v.created_at = M.max_created
ORDER BY created_at DESC
有人能帮我把它变成雄辩的或让我进入另一个方向吗?
如果您可以使用 AUTO_INCREMENTid
列而不是created_at
,则可以使用另一种方式来获得(相同)结果:
select *
from visitors
where id in (
select MAX(id)
from visitors
group by descr
)
ORDER BY id DESC
此查询可能效率较低,但与 eloquent 一起使用更容易,因为它whereIn()
支持子查询。
$subQuery = Visitor::groupBy('descr')->select(DB::raw('max(id)'));
$latestVisitors = Visitor::whereIn('id', $subQuery)->orderBy('id', 'desc')->get();
请注意descr
,如果 increated_at
中的值相同,您的原始查询可以返回多行 per 。使用id
它不会发生这种情况,因为它是独一无二的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句