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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:57:33