工作摘记一(求必修课的活动数量以及已完成的必修课活动数量)

原创 2012年03月21日 14:10:53

题:

求必修课的活动数量以及已完成的必修课活动数量

数据库的数据字典:

lcms_termcourse_task   章表{主键:task_id}

lcms_termcourse_task_chpt  章与节的关联表(它是中间表){没主键,但有task_id和chapter_id}

lcms_course_chapterinfo 节的基本信息表{主键:chapter_id,上级ID:PARENT_ID,层级:LAYER_TYPE,是否必修:IS_MUST}

lcms_termcourse_act  活动表{主键:ACT_ID,章ID:TASK_ID,章节ID:CHAPTER_ID}


问题描述:

由于每一节点都可以设置其为必修课,而此章为一个树形结构,将不知道这必修课会设置到那一层里面。因此之前一直认为要遍历该章所有的活动,然后根据每一个活动去搜索其父节点,看是否已被设置为必修,若直接父级为非必修,则往上继续搜索,一直找到根为止。如果一直找到根都没有找到IS_MUST为1的话,那么就标志此活动为非必修课的活动。如果是这样的话,一句SQL语句是搞不掂,(我想:非必要时,不写数据库函数或者存储过程。那就是能用SQL查询的,就用SQL来查询),而且效率上也有很大问题。


经过思考,我认为分为两种情况,1、搜索第一层的节点,若第一层为必修课的,就不再搜索此节点的下层。因此一旦搜索到,就标明此层下面所有子节点的活动都为必修课。2、若第一层为非必修课的,则重复此操作(向下搜索)。但这样还是要分两步走,一条SQL还是完不成我想要的。

第一步的SQL如下:

 select t2.act_id
       from (select c.*
               from lcms_course_chapterinfo c
              start with c.chapter_id in
                         (select b.chapter_id
                            from lcms_termcourse_task      a,
                                 lcms_termcourse_task_chpt b,
                                 lcms_course_chapterinfo   c
                           where a.task_id = b.task_id
                             and b.chapter_id = c.chapter_id
                             and a.task_id = ?
                             and c.layer_type = '1'
                             and c.is_must = '1'
                             and a.isdeleted = 'N' and b.isdeleted = 'N' and c.isdeleted = 'N')
             connect by prior c.chapter_id = c.parent_id) t1,--求出第一层必修下的所有章ID
            (select * from lcms_termcourse_act t where t.task_id = ?
              and t.isdeleted = 'N' ) t2--求出该章下的所有活动
      where t1.chapter_id = t2.chapter_id;


那么第二步该如何写SQL呢?想了想,觉得还是不妥呀。


从第一步中再仔细分析发现:

既然可以查询出第一层的已必修的节点,那么该章下所有被标明为必修的节点都应该能被查询出来呀。查询出来后,再搜索它下层的活动不就行了。

OK,开始修改SQL:

被标明为必修的所有节点:

                select c.chapter_id
                        from lcms_course_chapterinfo c
                       where c.is_must = '1'
                       start with c.chapter_id in
                                  (select b.chapter_id
                                     from lcms_termcourse_task      a,
                                          lcms_termcourse_task_chpt b,
                                          lcms_course_chapterinfo   c
                                    where a.task_id = b.task_id
                                      and b.chapter_id = c.chapter_id
                                      and a.task_id =
                                          '2f16cf45ac10a58d000c157e603a5549'
                                      and c.layer_type = '1'
                                      and a.isdeleted = 'N'
                                      and b.isdeleted = 'N'
                                      and c.isdeleted = 'N')
                      connect by prior c.chapter_id = c.parent_id

然后搜索其下层活动:

select c.*
           from lcms_course_chapterinfo c
          start with c.chapter_id in
                     (select c.chapter_id
                        from lcms_course_chapterinfo c
                       where c.is_must = '1'
                       start with c.chapter_id in
                                  (select b.chapter_id
                                     from lcms_termcourse_task      a,
                                          lcms_termcourse_task_chpt b,
                                          lcms_course_chapterinfo   c
                                    where a.task_id = b.task_id
                                      and b.chapter_id = c.chapter_id
                                      and a.task_id =
                                          '2f16cf45ac10a58d000c157e603a5549'
                                      and c.layer_type = '1'
                                      and a.isdeleted = 'N'
                                      and b.isdeleted = 'N'
                                      and c.isdeleted = 'N')
                      connect by prior c.chapter_id = c.parent_id)
         connect by prior c.chapter_id = c.parent_id


最后关联活动表,查询出必修的活动:

 select distinct t2.act_id
   from (select c.*
           from lcms_course_chapterinfo c
          start with c.chapter_id in
                     (select c.chapter_id
                        from lcms_course_chapterinfo c
                       where c.is_must = '1'
                       start with c.chapter_id in
                                  (select b.chapter_id
                                     from lcms_termcourse_task      a,
                                          lcms_termcourse_task_chpt b,
                                          lcms_course_chapterinfo   c
                                    where a.task_id = b.task_id
                                      and b.chapter_id = c.chapter_id
                                      and a.task_id =
                                          '2f16cf45ac10a58d000c157e603a5549'
                                      and c.layer_type = '1'
                                      and a.isdeleted = 'N'
                                      and b.isdeleted = 'N'
                                      and c.isdeleted = 'N')
                      connect by prior c.chapter_id = c.parent_id)
         connect by prior c.chapter_id = c.parent_id) t1, --求出第一层必修下的所有章ID
        (select *
           from lcms_termcourse_act t
          where t.task_id = '2f16cf45ac10a58d000c157e603a5549'
            and t.isdeleted = 'N') t2 --求出该章下的所有活动
  where t1.chapter_id = t2.chapter_id


这样,就大功告成了,其实这里使用了distinct。把相同的活动过滤掉。


至于已完成 的必修课的活动,也很简单了。这样就不描述了。






CRM 促销活动-实际赠品数量修改-实现方法

侯志宇 2014-10-30 促销活动-实际赠品数量修改-实现方法 事物代码:GENIL_MODEL_BROWSER - 一般交互层应用程序的模型浏览器 *"*"本地接口: *"  ...
  • SAPHOME
  • SAPHOME
  • 2014年11月05日 19:17
  • 1425

51nod 活动安排之二 最少教室数量 贪心

题意:有若干个活动,第i个活动开始时间和结束时间是[si,fi),活动之间不能交叠,要把活动安排完,问至少需要多少个教室。 分析: 一下是51nod教程上的分析: 策略: 按照开始时间排序优先安...
  • Na_OH
  • Na_OH
  • 2017年03月18日 23:32
  • 166

javaweb 简单的文件上传动态添加上传文件数量[从学习到工作(六)]

1.jsp页面主要代码块 upload" method="post" enctype="multipart/form-data"> File: ...

微软工作流活动研究

  • 2011年10月12日 12:53
  • 1.59MB
  • 下载

机试题:求兔子数量

  • 2017年03月05日 21:56
  • 1KB
  • 下载

技术团队工作外娱乐放松活动方案收集

程序员的收入其实不低,但很多人自称屌丝,主要是因为加班多,而且大部分工作没有成就感。他们把这种苦逼情绪放大后,就这样加入了屌丝行列。但是,也会有很多好公司具有人性化的管理,特别是小型公司和创业公司,会...
  • hursing
  • hursing
  • 2013年12月04日 11:39
  • 3790

CSDN社区分享面试经历活动作品9——找工作之路

学了信息与计算科学专业,毕业时,不知道要找什么工作,想来想去,程序员和专业有点搭边。所以感觉可以干这个。大学里学习不是很好,感觉能力不够。和几个同学一起报了一个培训班。其他同学都报了.net,我报了j...
  • CSDN
  • CSDN
  • 2012年02月28日 13:49
  • 1469

文化部办公厅关于开展第十九批违法违规互联网文化活动查处工作的通知

http://www.ccm.gov.cn/swordcms/publish/default/static/tzgg/846987655.htm 文化部办公厅关于开展第十九批违法违规互联...
  • clapton
  • clapton
  • 2013年12月26日 10:26
  • 1506
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:工作摘记一(求必修课的活动数量以及已完成的必修课活动数量)
举报原因:
原因补充:

(最多只允许输入30个字)