表 POI 有 字段 Title CityID
表City 有字段 ID Title ParentCityID(归属City)
求当 烟台下的所有PoiTitle (包含烟台下的子城市中的PoiTitle)
第一步先查询 烟台下所有城市(PCityId指向烟台) CTE
with cte_child(id,title,ParentCityId) as (select id,title,ParentCityId from CMSCity where Title=‘烟台’ union all select a.id,a.title,a.ParentCityId from CMSCity a
inner join cte_child b on ( a.ParentCityId=b.id)) select * from cte_child
第二步操作 poi
修改后sql为:
with cte_child(id,title,ParentCityId) as (select id,title,ParentCityId from CMSCity where Title=‘烟台’ union all select a.id,a.title,a.ParentCityId from CMSCity a
inner join cte_child b on ( a.ParentCityId=b.id)) select CMSPois.CityId,CMSPois.Title from CMSPois inner join cte_child on CMSPois.CityId =cte_child.id
表 POI 有 字段 Title CityID表City 有字段 ID Title ParentCityID(归属City)求当 烟台下的所有PoiTitle (包含烟台下的子城市中的PoiTitle)第一步先查询 烟台下所有城市(PCityId指向烟台) CTEwith cte_child(id,title,ParentCityId) as (select id,title,ParentCityId from CMSCity where Title=‘烟台’ union all
基本上在每个系统中都有那么几张表是自关联父子关系的结构。往往有很多人都是使用pid来做关联。在刚进入IT行业时使用CAKEPHP框架编写WEB的时候,使用它里面的一个ACL plugin实现权限管理的时候。发现一个表结构硬是不明白是怎么回事。具体表结构如下:
CREATE TABLE acos (
id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
parent_id INTEGER(10) DEFAULT NULL,
model VARCHAR(255) DEFAULT '',
foreign_key INTEGER(10) UNSIG
bankid level name head name
00017 1 中国银行河南省分行 00001 中国银行河南省分行
10951 2 中国银行郑州自贸区分行 00017 中国银行郑州自贸区分行
10952 3 中国银行郑州行政区支行 10951 中国银行郑州行政区支行
10953 3 中国
文章目录1. 动态
sql
OGNL表达式1.1 If 标签1.2 5.2. Where标签1.3
Sql
片段1.4 foreach标签1.5 set 标签1.6 choose(when,otherwise)2. 关联
查询
2.1 一对一
查询
2.1.2 方法一:使用resultType2.1.2 方法二:使用resultMap2.2 一对多
查询
3. 级联
查询
3.1 一对一
查询
3.2 一对多
查询
1. 动态
sql
OGNL表达式
OGNL 表达式,是一种开源的表达式语言,Mybatis的动态
SQL
就是基于
工作中遇到这样一个需求:
部门分为三层,从上往下依次是:一级部门、二级部门、三级部门,要求用户搜索三级部门的名称,然后返回该三级部门,以及它所在的一级部门和二级部门。如下图所示:
这个需求的实现很简单:先
查询
出三级部门,再分别
查询
它所在的二级部门、一级部门,就可以得到前端所需的结果。
但是在 Code Review 时,组长提出了一个问题:如果部门等级更深了,比如增加到5级、10级,这个实现方式是不是要
查询
5次、10次?这个时候该怎么实现?
这样,问题就变成了一个 My
SQL
多级
查询
的问题,与前面
with 自定义结果名称(Id,Name,Pid) as (
select Id,Name,Pid from 要
查询
的表名称where Id ='' --顶级的
查询
条件,要
查询
哪个父级的所有子级,条件就写哪个
union all
select 要
查询
的表名称.Id,要
查询
的表名称.Name,要
查询
的表名称.Pid from 要
查询
的表名称,自定义结果名称 where 要
查询
的表名称.Pid = 自定义结果名称.Id
select * from 自定义结果名称;
Id,Name,Pid ..
我们在项目开发过程,经常会遇到有文章分类分栏,菜单分类,视频分类等
多级
分类
那么这种
多级
分类我们在数据中又是如何设计的呢?在mybatis
查询
过程中又是如何
多级
查询
的呢?
别着急,今年我们来解决这个需求,
当然,解决的方法有很多,这里我只介绍我自己使用的一种,有更好的方法可以评论区评论大家一起探讨
本次用到了 `Maven工程`、`Swagger`、`RESTful接口风格`、`MyBatis-Plus`
sql
server父子递归
查询
指的是在一张表中,通过某一列的父子关系建立递归
查询
,以获取某一节点的所有子孙节点或所有祖先节点的一种
查询
方式。一般情况下,父子递归
查询
需要使用到
sql
server中的
CTE
(通用表达式)功能。
在进行父子递归
查询
时,需要先确定递归关系所依赖的列名,并对其进行命名。然后,通过WITH关键字,定义一个
CTE
来连接包含父子关系的表,并给其取一个别名。接着,在该
CTE
中使用递归
查询
语句,以获取所需的结果。
递归
查询
语句需要包含以下几个部分:首先是递归结束条件,用来终止递归的过程;其次是递归体,用来确定递归下一步所需要获取的数据;最后是
查询
语句,用来获取最终需要的结果。
在递归
查询
中,为了能够判断某一节点是否为叶子节点或根节点,可以使用CASE语句进行判断。如果在
查询
中需要对结果进行排序,可以使用ORDER BY关键字,指定排序规则。
需要注意的是,在进行父子递归
查询
时,需要考虑性能问题。如果表中记录非常多,递归的过程也会比较复杂,可能会导致
查询
时间变得非常长。因此,在实际应用中,需要根据具体情况进行优化,例如在表中添加索引等。