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

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

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

$videos = Video::with(['category:id,name'])->get()->groupBy('category_id')->toArray();
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 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

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

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

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

2年前 评论
李小明 (楼主) 2年前
ononl (作者) 2年前
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 条。

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

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

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

如果分类不多,是有限个,可以使用 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();

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

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

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

试试

\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();
2年前 评论
李小明 (楼主) 2年前
guanguans (作者) 2年前
superwen

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

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

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

2年前 评论