需求: 一篇文章里有很多评论,每个评论又有很多回复评论,要求: 页面将文章展示出来,且文章的主评论按照评论时间分页展示,回复评论的评论完全展示在每个主评论下面,且按照回复时间排序

最终查询结果SQL查询结果如下:

Code: 评论编码,ParentCode:回复评论编码,num:主评论序号,lvl:评论层级,CreateTime:评论创建时间

SQL详细过程如下:

1-先创建我们的数据临时表作为基础数据:

a.ContentInfoCode为文章编码
SELECT * INTO #a FROM (
SELECT A.LikeNum, F.Title AS ContentTitle,A.CommentNum,A.ValidStatus, A.Code, E.CommentInfo as ReplayCommentInfo,A.CommentInfo,A.ParentCode, A.CreateTime ,B.LogoImageUrl ,( CASE WHEN D.Code IS NULL then '' else '' end) as IsLike ,C.LoginName,C.UserName,G.LoginName AS ReplyLoginName,G.UserName as ReplyUserName,f.ValidStatus as ContentValidStatus,a.ContentInfoCode
FROM [Content].Comment A LEFT JOIN [OAuth].[UserHeadPhoto] B ON A.Creator=B.UserID and B.[VersionEndTime]='9999-12-31 23:59:59'
LEFT JOIN [OAuth].[UserInfo] C ON (A.Creator=C.UserID and c.Status=1 )
left join [Content].[UserAction] D ON (A.Code=D.CommentCode AND D.ActionType=1 AND D.Creator='b231f35a76a346449b2f4c5ddb4f88e7' )
left Join [Content].Comment E ON A.ParentCode=E.Code left join [Content].[ContentInfo] F on a.ContentInfoCode =f.code left join [OAuth].[UserInfo] G ON (E.Creator=G.UserID and G.Status=1 )
WHERE 1=1 and a.ContentInfoCode='042f89bea6ee40f4968d2a219352f2f8'
) A

2-按照递归查询格式创建递归查询:

主评论集合--根数据--涉及表名:cte c,需要增加过滤条件:ParentCode IS NULL

子评论集合--子数据--涉及表名:#a,不加条件

with cte as
(
SELECT * FROM (
select *,0 as lvl,ROW_NUMBER() over(order by CreateTime desc ) num from #a
WHERE ParentCode IS NULL
) B WHERE B.num BETWEEN 1 AND 20 --主评论集合
union all
select #a.*,c.lvl+1,c.num --子评论要展示的列(lvl层级列,按照c.Code=#a.ParentCode每层级+1,子评论num列直接使用主评论序号)
from cte c
inner join #a on c.Code = #a.ParentCode --主评论和子评论关系
)
select * from cte ORDER BY num,CreateTime DESC --查询最终结果_按照主评论序号和创建时间排序

3-查询结果,并删除临时表:

select * from cte ORDER BY num,CreateTime DESC   --主评论和子评论关系
DROP TABLE #a   --删除临时表

SQL_递归查询(复杂查询示例)的更多相关文章

  1. Elasticsearch .Net Client NEST 多条件查询示例

    Elasticsearch .Net Client NEST 多条件查询示例 /// <summary> /// 多条件搜索例子 /// </summary> public c ...

  2. NHibernate查询示例合集

    基本查询   复杂查询示例 /// <summary> /// 获取自定义表单数据中属于部门的部分 /// </summary> /// <param name=&quo ...

  3. MyBatis 查询示例

    环境搭建 数据库schema 1)datasource.xml配置 <?xml version="1.0" encoding="UTF-8"?> & ...

  4. spring boot - 整合jpa多对对关系保存和查询示例

    pojo: package com.example.zs.springDataJpa; import org.hibernate.annotations.Proxy; import javax.per ...

  5. Elasticsearch 邻近查询示例

    Elasticsearch 邻近查询示例(全切分分词) JAVA API方式: SpanNearQueryBuilder span = QueryBuilders.spanNearQuery(); s ...

  6. Accessoft-日期区间段查询示例,开始日期至截止日期区段查询

    Accessoft-日期区间段查询示例,开始日期至截止日期区段查询 实现功能效果如下: 示例查询开始日期为2017年3月15日到2017年3月16日的内容: sql查询语句如下: SELECT Inf ...

  7. SQL Server-简单查询示例(十一)

    前言 本节我们讲讲一些简单查询语句示例以及需要注意的地方,简短的内容,深入的理解,Always to review the basics. EOMONTH 在SQL Server 2012的教程示例中 ...

  8. Spring SimpleJdbcTemplate查询示例

    这里有几个例子来说明如何使用SimpleJdbcTemplate query()方法来查询或从数据库中提取数据.在 JdbcTemplate query() 方法,需要手动转换返回的结果转换为一个目标 ...

  9. mysql——单表查询——分组查询——示例

    一.基本查询语句 select的基本语法格式如下: select 属性列表 from 表名和视图列表 [ where 条件表达式1 ] [ group by 属性名1 [ having 条件表达式2 ...

随机推荐

  1. 【原创】我是怎么从零开始教女同学进行php开发的(4)

    周末给自己放了一个小假,周五晚上跟同学出去吃饭,周六又休息了一天,直到周日才坐到电脑前面码字. 本来说好周末这两天把之前三篇的代码根据评论中的建议好好修改一下的,顺便认真系统地学习一遍HTML基础.结 ...

  2. [浅学] 1、Node.js尝试_安装&运行第一个helloworld

    官网:https://nodejs.org/ 介绍:Node.js® is a platform built on Chrome's JavaScript runtime for easily bui ...

  3. LuaAlchemy API 介绍

    The AS3 Sugar provides a Lua-like way to access AS3 class and instance creation, property getter/set ...

  4. linux网络编程系列-网络连接的建立

    一个比较实用的连接函数,支持host为域名. #include <netdb.h> #include <sys/socket.h> #include <sys/types ...

  5. Qt 设置应用程序图标

    Qt4设置应用程序图标 将一个ico图标放在资源文件夹下; 然后建立txt,输入 IDI_ICON1 DISCARABLE "myico.ico"; 保存文件,将其后缀改为.rc; ...

  6. Nginx下WordPress的Rewrite

    最近接触WP Super Cache,该插件要求固定链接必须是重写的,故用到Rewrite. 我的是这样配置的: /usr/local/nginx/conf/rewrite/wordpress.con ...

  7. iOS---用LLDB调试,让移动开发更简单(一)

    因文章字数超过限制,所以拆分成了上下篇 LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.平时用Xcode运行程序,实际走的都是LLDB.熟练使用 ...

  8. JavaScript对浏览器的URL进行编码、解码

    关于url编码,js有三个函数.有三个解码方法,escape,encodeURI,encodeURIComponent().有三个解码方法,unescapse,decodeURI,decodeURIC ...

  9. Python中的__new__和__init__

    Python中的__new__和__init__ 写了这么多的class,现在才知道还有个__new__方法, 那么它和__init__有什么区别呢? class TestCls(): "& ...

  10. 静态(static)代码块、构造代码块、构造函数、父类子类执行顺序

    静态代码块:static修饰的代码块. 在类加载-初始化的时候进行,主要目的是给变量赋予初始值 构造代码块:直接在类中定义且没有加static关键字的代码块称为构造代码块. java会把构造代码块放到 ...