如何通过groupBy只获取到每个分类下的三条数据呢?

videos表中有category_id 区分综艺 动漫等;

//我尝试使用会获取到category_id下的全部数据,如何只获取updated_at 最后三条数据呢

$videos = Video::with(['category:id,name'])->get()->groupBy('category_id')->toArray();
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 22
select c.id, c.name, 
    SUBSTRING_INDEX(group_concat(v.id order by v.updated_at desc), ',', 3) vids, 
    SUBSTRING_INDEX(group_concat(v.name order by v.updated_at desc), ',', 3) v_names 
from video v join category c on xx 
group by c.id

查出来之后再处理一下就行了

1年前 评论
李小明 (楼主) 1年前

可以换个思路,查分类表使用 Category::with(['videos']),只需要关联模型中使用orderBy,和limit就可以实现了。

1年前 评论
李小明 (楼主) 1年前
ononl (作者) 1年前
select * from shop a where N > (select count(*) from shop b where b.shop_name = a.shop_name
 and a.price < b.price) order by a.shop_name,a.price desc;

你参考这个语句实现,shop_name 相当于你的分类ID,price 相当于你的 updated_at 。
每种分类显示多少条数据,把 N 换成需要显示对应的数字即可,大于还是小于是控制你要取最大N条还是最小N条。

1年前 评论
李小明 (楼主) 1年前

MySQL 8.0 以上的,可以用窗口函数来实现,其他版本也有其的实现方式,搜索 MySQL TopN

1年前 评论
李小明 (楼主) 1年前

如果分类不多,是有限个,可以使用union all联合查询

// 综艺
$queryOne = Video::with(['category:id,name'])->where("category_id","综艺分类id")->orderBy("updated_at", "desc")->limit(3)->select("*");

// 动漫
$queryTwo = Video::with(['category:id,name'])->where("category_id","动漫分类id")->orderBy("updated_at", "desc")->limit(3)->select("*");

// 纪录片
$queryThree = Video::with(['category:id,name'])->where("category_id","纪录片分类id")->orderBy("updated_at", "desc")->limit(3)->select("*");

// 联合查询
$list = $queryOne->unionAll($queryTwo)->unionAll($queryThree)->get();

1年前 评论
李小明 (楼主) 1年前

按照楼上所说的换个思路,用分类去关联查视频

$categories = Category::with([
    'video'=>function ($query) {
        $query->orderBy('updated_at', 'desc')->limit(3);
    }
])
->get()
->toArray();
1年前 评论
看上隔壁小花了啦 (作者) 1年前
hefengbao 1年前
李小明 (楼主) 1年前
看上隔壁小花了啦 (作者) 1年前

试试

\DB::table('videos as a')
    ->select('*')
    ->whereRaw('3 > (SELECT COUNT(*) FROM videos as b WHERE b.category_id = a.category_id AND b.updated_at > a.updated_at)')
    ->orderBy('a.category_id')
    ->orderByDesc('a.updated_at')
    ->get();

DB::table('videos as a')
    ->select('a.*')
    ->leftJoin('videos as b', function ($join){
        $join->on('a.category_id', '=', 'b.category_id')
            ->on('a.updated_at', '<', 'b.updated_at');
    })
    ->groupBy('a.id')
    ->havingRaw('COUNT(b.id) < 3')
    ->orderBy('a.category_id')
    ->orderByDesc('a.updated_at')
    ->get();
1年前 评论
李小明 (楼主) 1年前
guanguans (作者) 1年前
superwen

这种排行榜的数据最好是从数据库里面读出来然后cache,如果是cache你多查几次也无所谓了

1年前 评论
李小明 (楼主) 1年前
test2018

先遍历分类 然后 limit取 video数据不行吗?

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!