某教育平台项目开发之--数据库设计(设计视图)(上)

    xiaoxiao2026-10-04  1

    本次开发采用mysql数据库,遇到一个非常难搞的业务需求。这里先上本项目的数据库设计:

    在这里我用自己的话概括一下关于课程这张表的事情。

    课程分为免费跟收费,但是数据库的表中没有一个叫”is_free”的字段,但有一个叫”price”的字段,当price==0.0的时候我们就叫免费,当price>0.0的时候我们叫收费,免费的课程并不是都可以学习,我们依然采用“需要购买的方式”,即使是免费也需要购买,只有购买了课程,这个课程的学习人数才能加一。

    业务需求比较复杂,具有学习卡这个东西,学习卡是要买的,里面存储着收费的课程。所以只要买了学习卡就相当于购买了课程,这些课程的学习人数都得加一。

    使用中的学习卡部分的课程:

    1、获取在使用中的学习卡的课程的部分信息:

    SELECT c.id AS "id", c.course_num AS "courseNum", c.course_name AS "courseName", c.price AS "price" FROM course AS c , stuc_course AS scs, study_card AS scd WHERE scd.id=scs.stuc_id AND scs.course_id=c.id AND scd.is_used=1

    得到的数据当然会有重复,因为我只是显示了部分字段,正因为如此,我才可以计算学习人数,结果如下:

    2、获取在使用中的学习卡的课程的部分信息和学习人数:

    SELECT c.id AS "id", c.course_num AS "courseNum", c.course_name AS "courseName", c.price AS "price", COUNT(*) AS counts FROM course AS c , stuc_course AS scs, study_card AS scd WHERE scd.id=scs.stuc_id AND scs.course_id=c.id AND scd.is_used=1 GROUP BY c.id

    得到的结果如下,看这个结果的时候可以参照上一张结果图:

    订单部分中的课程: 1、获取在订单的课程的部分信息:

    SELECT c.id AS "id", c.course_num AS "courseNum", c.course_name AS "courseName", c.price AS "price" FROM orders AS o, course AS c WHERE o.course_id=c.id AND o.is_finished=1

    结果如下:

    这里要注意的是,“使用中的学习卡部分”和“订单中部分”有些课程会重复,因为试想这样一个场景: A课程售价100元,“001”学习卡中收录了A课程,那么如果有人买了“001”学习卡,他就算一个学习本课程的人;但是也有人不买学习卡,他只要A课程,所以就在订单表也能找到A课程, 就是这样的一个业务需求。

    2、获取在订单中的课程的部分信息和学习人数:

    SELECT c.id AS "id", c.course_num AS "courseNum", c.course_name AS "courseName", c.price AS "price", COUNT(*) AS counts FROM orders AS o, course AS c WHERE o.course_id=c.id AND o.is_finished=1 GROUP BY c.id

    结果如图:

    因为业务需求主要是得到课程的学习人数嘛,那学习人数为0的呢,怎么办?学习人数为0的就不能用上面的那些思路去思考了,只能通过这种思路: (1)获取所有课程的ID (2)获取订单中课程的ID (3)获取使用中的学习卡的课程的ID (4)获取(1)中不在(2)中的ID并且不再(3)中的ID

    不在订单中也不在使用中的学习卡中的课程

    1、获取不在订单中也不在使用中的学习卡中的课程的部分信息:

    SELECT c.id AS id, c.course_num AS courseNum, c.course_name AS courseName, c.price AS price FROM course AS c WHERE c.id NOT IN( SELECT DISTINCT course_id FROM orders WHERE orders.is_finished=1 ) AND c.id NOT IN( SELECT DISTINCT s2.course_id FROM study_card AS s1, stuc_course AS s2 WHERE s1.id=s2.stuc_id AND s1.is_used=1 )

    结果如下:

    2、获取不在订单中也不在使用中的学习卡中的课程的部分信息和学习人数:

    SELECT c.id AS id, c.course_num AS courseNum, c.course_name AS courseName, c.price AS price, COUNT(*)-1 AS counts FROM course AS c WHERE c.id NOT IN( SELECT DISTINCT course_id FROM orders WHERE orders.is_finished=1 ) AND c.id NOT IN( SELECT DISTINCT s2.course_id FROM study_card AS s1, stuc_course AS s2 WHERE s1.id=s2.stuc_id AND s1.is_used=1 ) GROUP BY c.course_num;

    注意到COUNT(*)-1 AS counts,因为这些都是无人学习的,学习人数为0,但是只要你列举出来,COUNT(*)都会得到1。

    结果如图:

    转载请注明原文地址: https://ju.6miu.com/read-1312622.html
    最新回复(0)