mysql中实现按照固定周数信息返回业务数据

1.需求描述

        1.支持按照周数查询周一到周天的课程信息,不限制查询上周下周数;

        2.前后端返参协议:

周二到周五由于页面的原因隐藏不进行显示.要求按照一周的格式进行返回,如果某天没有数据则需要返回空集合,但是天数信息需要进行返回,以便于前端遍历渲染.

2.实现方案

        1.mysql中实现根据周数查询一周的课程信息:

SELECT wy_Client_user.`first_name`,manage_course.`course_name`,t.LEVEL,t.color,DAYOFWEEK(t.start_time)-1 week_day,DATE_FORMAT(t.start_time,'%H:%m') start_time,DATE_FORMAT(t.end_time,'%H:%m') end_time
FROM 
	(SELECT LEVEL,color,start_time,end_time,teacher_id,course_id FROM manage_course_table
	WHERE YEARWEEK( DATE_FORMAT(  start_time,'%Y-%m-%d' ),1 ) = YEARWEEK(NOW(),1)+(#{weekCount}) AND STATUS=1 ) t
LEFT JOIN wy_Client_user ON t.`teacher_id`=wy_Client_user.`login`
LEFT JOIN manage_course ON manage_course.`id`=t.`course_id` WHERE manage_course.`studio_id`=1 ORDER BY t.start_time ASC

 核心业务说明:

select  * from 表 WHERE YEARWEEK( DATE_FORMAT(  时间字段,'%Y-%m-%d' ),1 ) = YEARWEEK(NOW(),1)+(#{weekCount})   

weekCount表示是要查询的周数,本周传0,下一周传1,下下周传2,以此类推;上周传-1,上上周传-2,以此类推.

        2.按照一周的天数进行返回,某天没有数据的也要返回周几数.这种场景想到的方案是类似于按照一周的天数进行左连接查询业务数据.没有数据的就是空值,保证周一到周天都有数据.可以建立一个日期天数表manage_week_day,存储周一到周天的日期.然后此表与业务查询sql进行左连接查询.使用collection标签进行组装数据返回.

manage_week_day日期表信息:

mapper接口实现:

List<StudioCourseWeekTableVo> findStudioCourseWeekTable(@Param("courseWeekTableDo")CourseWeekTableDo courseWeekTableDo);

mybatis配置文件写法:

<resultMap id="weekCourseMap" type="com.kawaxiaoyu.api.appointCourse.vo.StudioCourseWeekTableVo">
        <id property="weekId" column="week_id"></id>
        <collection property="weekCourseTables" javaType="java.util.List" ofType="com.kawaxiaoyu.api.appointCourse.vo.WeekCourseTable">
            <result property="firstName" column="first_name"></result>
            <result property="courseName" column="course_name"></result>
            <result property="level" column="level"></result>
            <result property="color" column="color"></result>
            <result property="startTime" column="start_time"></result>
            <result property="endTime" column="end_time"></result>
        </collection>
    </resultMap>
    <!--查询周课程信息-->
    <select id="findStudioCourseWeekTable" parameterType="com.kawaxiaoyu.api.appointCourse.dto.CourseWeekTableDo"
            resultMap="weekCourseMap">
        SELECT manage_week_day.`week_id`,m.* FROM manage_week_day
            LEFT JOIN (SELECT wy_Client_user.`first_name`,manage_course.`course_name`,t.level,t.color,DAYOFWEEK(t.start_time)-1 week_day,DATE_FORMAT(t.start_time,'%H:%m') start_time,DATE_FORMAT(t.end_time,'%H:%m') end_time
            FROM
                (SELECT level,color,start_time,end_time,teacher_id,course_id FROM manage_course_table
                WHERE YEARWEEK( DATE_FORMAT(  start_time,'%Y-%m-%d' ),1 ) = YEARWEEK(NOW(),1)+(#{courseWeekTableDo.weekday}) AND STATUS=1 AND TYPE=#{courseWeekTableDo.type}) t
            LEFT JOIN wy_Client_user ON t.`teacher_id`=wy_Client_user.`login`
            LEFT JOIN manage_course ON manage_course.`id`=t.`course_id` WHERE manage_course.`studio_id`=#{courseWeekTableDo.studioId} ORDER BY t.start_time ASC) m ON manage_week_day.`week_id`=m.week_day
    </select>

 3.反思与总结

        1.mysql中YEARWEEK(时间)支持按照星期数进行查询,默认是周天是一周的第一天,所以想从周一开始查询,写法是YEARWEEK(时间,1),查询下周的数据:YEARWEEK(时间,1)+1,查询上周传-1,查询本周数据传0.

        2.对于数据库中查询指定时间内不存在数据但是返回参数中需要有指定时间的场景,暂时想到的就是添加一个天数表作为左连接查询的基础,这样能保证指定天数都会有数据返回,具体天数对应的数据根据业务实际需求进行返回,有则返回,没有则为空.创建的天数表仅作为组装参数使用.返回传参协议中周天没有数据就返回空集合:

 自己实现时想到的方案,如果大家有更好的方案可以评论区留言,不足之处可以指正!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卖柴火的小伙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值