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

Laravel中如何按分组随机返回对应ID?

Laravel分组随机获取每组ID的解决方案

你当前的写法返回固定ID的原因是:groupBy会先按r_type和d_from完成分组逻辑,直接取每组的第一条记录,而inRandomOrder()是全局排序,无法影响分组内的随机选择,所以每次结果都固定。下面提供几种可行的实现方式:

方法一:使用窗口函数(MySQL 8.0+ 推荐)

利用ROW_NUMBER()窗口函数为每个分组内的记录随机排序,再筛选出每组的第一条记录:

$randomIds = Sample::select('id')
    ->selectRaw('ROW_NUMBER() OVER (PARTITION BY r_type, d_from ORDER BY RAND()) as rn')
    ->having('rn', '=', 1)
    ->get()
    ->pluck('id');
  • PARTITION BY r_type, d_from:按指定字段分组
  • ORDER BY RAND():让每组内的记录随机排序
  • ROW_NUMBER():给每组内的记录按随机顺序编号,取编号为1的就是每组随机的一个ID

方法二:原生SQL分组随机取ID(兼容低版本MySQL)

通过GROUP_CONCAT和SUBSTRING_INDEX组合实现每组随机选ID:

$randomIds = DB::table('samples')
    ->select(DB::raw('SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY RAND()), ",", 1) as id'))
    ->groupBy('r_type', 'd_from')
    ->get()
    ->pluck('id');
  • GROUP_CONCAT(id ORDER BY RAND()):将每组的ID按随机顺序拼接成字符串
  • SUBSTRING_INDEX(..., ",", 1):截取拼接字符串的第一个ID,即每组随机选出的ID

方法三:分两次查询(适合小数据量场景)

先获取所有唯一分组,再逐个分组随机取ID:

// 获取所有唯一的(r_type, d_from)组合
$groups = Sample::select('r_type', 'd_from')
    ->distinct()
    ->get();

$randomIds = [];
foreach ($groups as $group) {
    $randomId = Sample::where('r_type', $group->r_type)
        ->where('d_from', $group->d_from)
        ->inRandomOrder()
        ->value('id');
    $randomIds[] = $randomId;
}

这种方法逻辑直观,但数据量大时会产生多次查询,性能稍差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:30:11