mysql数据库查询

这一段时间在实习的公司里和别人共同开发一个新功能,我主要偏数据库操作!其中有一个是对数据的校验,而这些数据在数据库里是以树的形式存在!没有问别人之前我是打算以循环的方式来做,周日花了整整一下午把数据表研究了一番发现不是我想象的那么简单,我先把这个要求简单的描述一下:

首先是数据表里的数据,字段太多,我只查出一些有用的字段:


id是主键是主键由数据库自动生成,itemtype是类型,这些数据又两种类型,一个是分类,一个是条目(下一张图片会明白),name是名称,parentid是直属上级id(要是之前有接触过树形结构数据表的,会对parentid很熟悉)

再来是数据需要显示的效果:


没错,这是EXCEL表格,可以讲上面的数据和这个表格对应起来比较一下,每行内容后面的数据是我手动添加上去的,代表的是当前的id。

简单的解释一下,parentid为空的代表A列,也就是最高级节点,比如id为8和9的,然后parentid为8或9的就是B列的数据,然后是C列, 以此类推。。。最末级成为条目itemtype为1,其余的为分类,itemtype为0,上图8~13就是分类,14~23就是条目,介绍完了,下面是要求,每一个条目(包括本身)的所有上级,必须有且只有一个分类或条目指定有效基分(有效基分是其他数据表里的字段这个不需要理会,他们之间的联系是id)

不知道大家看完之后会使用什么样的方法校验,我记得那天下午把数据表弄了明白之后,用循环的方式进行校验的,因为这样的树形数据表之前听也没听说过,这次是第一次接触。。。

第二天上班问了老员工,问她会使用什么样的方法进行校验,她说了一句“用树查询啊!”我一愣?后面的就没有听下去,树查询是什么东东啊!急忙跑去问度娘,温柔的度娘“啪”的一声罗列出几百万条记录,我简单的看了一下,寻找我能用到的答案!

树查询语法:

     

[sql]  view plain  copy
  1.   select ... from tablename start with 条件1  
  2. connect by 条件2  
  3. where 条件3;  

       条件1 是根结点的限定语句,就是以什么字段为节点(一般以id)当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。
  条件2 是连接条件,其中用PRIOR表示上一条记录,这一点容易混淆

  • connect by prior parentid = t.id表示上一条记录的parentid是本条记录的id,也就是说本条记录是上一条的父级节点,就表示以条件1为节点查出来的都是父级节点;
  • connect by prior id = t.parentid表示上一条记录的id是本条记录的parentid,也就是说本条记录本条记录是上一级的子节点,就表示以条件1为节点,查出来的都是子节点。

  条件3 是过滤条件,用于对返回的所有记录进行过滤

这一句就解决了我的问题!

首先我先在另一张表里将有效积分数据的id找出来,通过id将数据从树形表里取出来放在一个list里,然后遍历list,使用查找所有父节点SQL语句:

[sql]  view plain  copy
  1. select * from tableName t where  t.id != :itemId start with t.id = :itemId connect by prior parentid = t.id;  
里面有个条件是

[sql]  view plain  copy
  1. t.id != :itemId  
是为了将本身节点 剔除 ,防止查出来的数据包含自身节点
查出来的数据放在parentList,然后再遍历,通过id查询另一张表里对应的数据下是否为有效积分,没有的话继续遍历下一个否则抛出异常,提示校验失败!

然后使用查找所有子节点SQL语句:

[sql]  view plain  copy
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">select * from tableName t where  t.id != :itemId start with t.id = :itemId connect by prior <span style="line-height: 16.8999996185303px;">id</span> = t.<span style="line-height: 16.8999996185303px;">parentid</span>;</span>  
同样使用遍历的方法进行校验

就如上图,以10为节点,先将所有的父级查出来进行校验,再将所有的子级查出来进行校验

树查询的好处就是一次性的将所有的父节点或子节点查出来。

就这样一个SQL语句解决了很多的问题,中途也不会出错,做开发最后还是对数据库的操作,就看你能不能hold住!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值