如何从5个指定分类ID中各查询N条数据?SQL语句求助
解决方案:按指定分类分别获取N条关联文章数据
为啥你的SQL不行?
- 第一条用
GROUP BY p.fk_category_id,相当于把每个分类下的所有结果合并成一条返回,自然拿不到N条数据。 - 第二条的
LIMIT 5是全局只返回5条,不是每个分类分配5条,而且排序按产品ID,根本没按分类控制数量。
推荐写法(支持MySQL8.0+/PostgreSQL/SQL Server等)
用ROW_NUMBER()窗口函数,给每个分类下的文章按顺序编号,然后筛选编号≤N的记录即可,假设N=5:
SELECT category_id, fk_produit_id, id, titre, prix, description, short_description, image_url FROM ( SELECT p.fk_category_id AS category_id, a.fk_produit_id, a.id, a.titre, a.prix, a.description, a.short_description, a.image_url, -- 按分类分组,给每组内的文章编号 ROW_NUMBER() OVER (PARTITION BY p.fk_category_id ORDER BY a.id DESC) AS row_num FROM articles a INNER JOIN produits p ON p.id = a.fk_produit_id WHERE p.fk_category_id IN (2, 248, 335, 493, 1038) ) AS ranked_data WHERE row_num <= 5; -- 把5换成你需要的N值
注:ORDER BY a.id DESC可以改成你需要的排序规则,比如按价格、发布时间排序都可以
旧版MySQL兼容写法(无窗口函数)
如果你的MySQL版本低于8.0,用用户变量来实现分组计数:
SELECT category_id, fk_produit_id, id, titre, prix, description, short_description, image_url FROM ( SELECT p.fk_category_id AS category_id, a.fk_produit_id, a.id, a.titre, a.prix, a.description, a.short_description, a.image_url, -- 同一个分类就计数+1,换分类就重置为1 @row_num := IF(@current_cat = p.fk_category_id, @row_num + 1, 1) AS row_num, @current_cat := p.fk_category_id FROM articles a INNER JOIN produits p ON p.id = a.fk_produit_id -- 初始化变量 CROSS JOIN (SELECT @current_cat := 0, @row_num := 0) AS vars WHERE p.fk_category_id IN (2, 248, 335, 493, 1038) -- 必须先按分类排序,否则计数会乱 ORDER BY p.fk_category_id, a.id DESC ) AS ranked_data WHERE row_num <= 5; -- 替换为你的N值
效果说明
不管用哪种写法,最终都会返回你指定的5个分类中,每个分类下最多N条关联的文章记录,完全匹配你要的结果格式。
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

