如何在MySQL中根据二级分类查询指定数量的内容?

mysql按照二级分类查询指定数量内容

分类表:

CREATE TABLE `category` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '分类名称',
  `parent_id` int DEFAULT NULL COMMENT '父ID',
  `sort` int DEFAULT NULL COMMENT '排序',
  `status` int DEFAULT '0' COMMENT '状态:0-显示,1-不显示',
  PRIMARY KEY (`id`) USING BTREE
) 

内容表:

CREATE TABLE `site` (
  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `one_category_id` int DEFAULT NULL COMMENT '一级分类ID',
  `two_category_id` int DEFAULT NULL COMMENT '二级分类ID',
  `three_category_id` int DEFAULT NULL COMMENT '三级分类ID',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '名称',
  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '地址',
  `label` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `address` (`address`)
) 

内容表中的一、二、三级分类ID,都是存的分类表的ID。

现在需要根据二级分类从内容表中查询出每个二级分类下8条内容,最终展示效果如下:
image.png

阅读 1.2k
2 个回答

我的逻辑如下
1.子查询 sub:使用窗口函数 ROW_NUMBER() 对每个 two_category_id 进行分区,并按 id 排序。
2.主查询:选择窗口函数 ROW_NUMBER() 小于等于 8 的记录。

SELECT *
FROM (
    SELECT s.*, 
           ROW_NUMBER() OVER (PARTITION BY s.two_category_id ORDER BY s.id) AS rn
    FROM site s
    JOIN category c ON s.two_category_id = c.id
    WHERE c.parent_id IS NOT NULL
) sub
WHERE sub.rn <= 8;

你是想通过一个 sql 把内容全部读取出来对吧, 理论上这个可以通过 mysql 的 存储过程 来实现, 但是在实际业务中一般不推荐这样实现, 首先 mysql 开发的要义之一,需要尽量避免长sql,减少数据库的压力, 一般正常业务在代码层会通过多个sql,循环遍历后将结果进行缓存就行,因为这个分类一般都是读多写少的业务场景,所以基本上业务只要读取缓存的数据,对数据库压力会很小。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏