Laravel实现按列值出现次数从多到少排序查询结果
按城市出现次数排序Laravel查询结果
要实现按City列的出现次数从多到少排序,同时保留所有原始记录,这里给你两种实用的实现方案:
方法1:子查询统计城市出现次数(写法简洁直观)
直接在主查询中嵌入子查询,计算每条记录对应城市的总出现次数,再按这个次数降序排序:
$list = SubscriberList::select('subscriber_lists.*') // 子查询:计算当前行所属城市的总出现次数 ->selectRaw('(SELECT COUNT(*) FROM subscriber_lists sl WHERE sl.city = subscriber_lists.city) AS city_count') // 按城市出现次数降序排列,次数相同时可追加城市名排序(可选) ->orderBy('city_count', 'desc') ->orderBy('city', 'asc') ->get();
方法2:预统计+关联排序(大数据量下性能更优)
先单独统计每个城市的出现次数,再通过逻辑关联将统计结果应用到排序中,适合数据量较大的场景:
// 第一步:提前统计所有城市的出现次数 $cityCountMap = SubscriberList::select('city', DB::raw('COUNT(*) AS total')) ->groupBy('city') ->get() ->pluck('total', 'city'); // 第二步:根据预统计的结果排序原数据 $list = SubscriberList::select('subscriber_lists.*') ->orderBy(function ($row) use ($cityCountMap) { // 匹配当前行城市对应的出现次数,默认0兜底 return $cityCountMap->get($row->city, 0); }, 'desc') ->get();
结果验证
两种方案都会输出你期望的排序效果:
Email City
abc@anc.com Delhi
jsd@juk.com Delhi
jfs@jfk.com Delhi
abc@njd.com Gurgaon
hfk@jfj.com Gurgaon
bhy@jfl.com Noida
内容的提问来源于stack exchange,提问作者abhi.abik
相关产品推荐
相关产品推荐

