当前位置: 首页 > 知识库问答 >
问题:

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

濮阳俊明
2024-10-23

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

共有2个答案

冯通
2024-10-23

我的逻辑如下
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;
翁良弼
2024-10-23

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

 类似资料:
  • 问题内容: 有没有办法从mySQL的子查询中指定父查询字段? 例如: 我已经用PHP编写了一个基本的公告板类型程序。 在数据库中,每个帖子都包含:id(PK)和parent_id(父帖子的ID)。如果帖子本身是父项,则其parent_id设置为0。 我正在尝试编写一个mySQL查询,该查询将查找每个父级帖子以及父级拥有的子级数。 棘手的是,第一个 ID 不知道它应该引用子查询之外的第二个 ID 。

  • 问题内容: 我在同一台服务器上有两个数据库。Google给了我一些提示,但是我找不到任何“官方”信息。有人可以指出我的文档来说明如何执行此操作吗?使用PHP的说明也将很有用。谢谢! 问题答案: 我在同一台服务器上有两个数据库。…如何在MySQL中构建跨数据库查询? 通过在表的前面加上适当的数据库名称,可以访问同一MySQL实例上的其他数据库。IE: 记住 查询将使用用于建立连接的身份验证凭据来执行

  • 本文向大家介绍MySQL使用select语句查询指定表中指定列(字段)的数据,包括了MySQL使用select语句查询指定表中指定列(字段)的数据的使用技巧和注意事项,需要的朋友参考一下 本文介绍MySQL数据库中执行select查询语句,查询指定列的数据,即指定字段的数据。 再来回顾一下SQL语句中的select语句的语法: Select 语句的基本语法: Select <列的集合> from

  • 问题内容: 我试图找到一个特定领域的所有深度的父母,祖父母等。例如,给定以下结构,如果我提供5,则返回的值应为1、2、3和4。 我该怎么做? 问题答案:

  • 主要内容:查询表中所有字段,查询表中指定的字段在MySQL 中,可以使用 SELECT 语句来查询数据。查询数据是指从数据库中根据需求,使用不同的查询方式来获取不同的数据,是使用频率最高、最重要的操作。 SELECT 的语法格式如下: 其中,各条子句的含义如下: 包含星号通配符的字段列表,表示所要查询字段的名称。 ,表 1 和表 2 表示查询数据的来源,可以是单个或多个。 是可选项,如果选择该项,将限定查询数据必须满足该查询条件。 ,该子句告

  • 问题内容: 是否可以根据MySQL中的查询结果设置用户变量? 我想要实现的是这样的事情(我们可以假设和都是唯一的): 请注意,我知道有可能,但我不希望使用嵌套查询。 问题答案: 是的,但是您需要将变量分配移至查询中: 测试用例: 结果: 请注意,对于,或可用作分配运算符。但是,在其他语句中,赋值运算符必须为并且不是,因为在非SET语句中将其视为比较运算符。 更新: 除了下面的评论,您还可以执行以下

  • 本文向大家介绍MySql设置指定用户数据库查看查询权限,包括了MySql设置指定用户数据库查看查询权限的使用技巧和注意事项,需要的朋友参考一下 一、新建用户: 1、执行sql语句新建(推荐): 2、使用工具新建: 二、设置权限 1、配置数据库以及数据表(记得保存): 2、设置【服务器权限】全部为撤销 3、刷新数据库权限: MariaDB [(none)]> FLUSH PRIVILEGES;Que

  • 本文向大家介绍MySQL百万级数据量分页查询方法及其优化建议,包括了MySQL百万级数据量分页查询方法及其优化建议的使用技巧和注意事项,需要的朋友参考一下 数据库SQL优化是老生常谈的问题,在面对百万级数据量的分页查询,又有什么好的优化建议呢?下面将列举了一些常用的方法,供大家参考学习! 方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM