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

如何在含JSON列的表中筛选出b字段值重复的行?

解决Laravel Eloquent中JSON列分组并获取重复行的问题

要获取JSON列value里b字段值重复的所有行,你原来的groupBy写法只会返回每组的第一条记录,拿不到所有重复行。这里给两种可行方案:

方案一:先筛选重复的b值,再查询对应行

先通过子查询找出所有出现次数≥2的b字段值,再基于这些值查询完整行数据:

// 提取重复的b字段值
$duplicateBValues = ProductsAttributesValues::select('value->b as b_value')
    ->groupBy('b_value')
    ->havingRaw('COUNT(*) >= 2')
    ->pluck('b_value');

// 获取所有b值重复的行
$duplicateRows = ProductsAttributesValues::whereIn('value->b', $duplicateBValues)->get();

方案二:使用WHERE EXISTS子查询

通过关联同一张表,直接筛选出存在其他相同b值的行:

$duplicateRows = ProductsAttributesValues::whereExists(function ($query) {
    $query->select(DB::raw(1))
        ->from('products_attributes_values as pav')
        ->whereRaw('pav.value->"$.b" = products_attributes_values.value->"$.b"')
        ->whereRaw('pav.id != products_attributes_values.id');
})->get();

原方法不生效的原因

你原来的groupBy("value->b")只是按b值分组,但默认仅返回每组第一条记录,且没筛选出重复次数≥2的分组。要拿到所有重复行,得先确定哪些b值是重复的,再反向查询对应行。

如果你的数据库是MySQL 5.7+或MariaDB,value->b的写法是支持的;要是遇到解析问题,可以改用JSON_UNQUOTE(JSON_EXTRACT(value, '$.b'))明确提取并去除引号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:40:37