You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 5.4如何从按score_total排序的前10条数据中随机取4条?

解决Laravel查询中inRandomOrder不生效的问题

你的问题核心在于Laravel查询构造器的链式调用是构建单条SQL,而非分步执行。原代码Cars::orderBy('score_total','DESC')->take(10)->inRandomOrder()->take(4)->get()最终生成的SQL逻辑是:先按score_total降序,再对全表随机排序,最后取4条——这完全不符合你“先取前10条高分数据,再从中随机选4条”的需求。

下面提供两种靠谱的解决方案,你可以根据场景选择:

方案1:集合层面处理(简单直观,适合小数据量)

先获取前10条数据的集合,再利用Laravel集合的random()方法直接随机抽取4条:

// 先获取按score_total降序的前10条数据集合
$top10Cars = Cars::orderBy('score_total', 'DESC')->take(10)->get();
// 从集合中随机取4条
$random4Cars = $top10Cars->random(4);

这种方法的优点是代码简洁易懂,缺点是会把10条数据全部加载到内存中,适合数据量不大的场景。

方案2:数据库层面处理(更高效,适合大数据量表)

通过子查询先筛选出前10条高分数据,再在这个子查询结果中随机取4条,让数据库完成所有逻辑:

$random4Cars = Cars::fromSubquery(
    // 子查询:获取前10条高分数据
    Cars::orderBy('score_total', 'DESC')->take(10),
    'top_cars' // 给子查询结果起别名
)->inRandomOrder()->take(4)->get();

或者用whereIn的方式,先获取前10条的ID,再基于ID随机查询:

// 先获取前10条数据的ID集合
$top10Ids = Cars::orderBy('score_total', 'DESC')->take(10)->pluck('id');
// 根据ID随机取4条
$random4Cars = Cars::whereIn('id', $top10Ids)->inRandomOrder()->take(4)->get();

这两种写法都会生成更精准的SQL,让数据库只处理必要的数据,性能更优,适合表数据量较大的场景。

内容的提问来源于stack exchange,提问作者user6122500

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:10:44