如何在含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
相关产品推荐
相关产品推荐

