Sfoglia il codice sorgente

fix: left outer join, if a course doesn't has likes

ChengYuXuan 5 anni fa
parent
commit
e8875ad51c
1 ha cambiato i file con 30 aggiunte e 15 eliminazioni
  1. 30 15
      src/main/resources/mapper/CourseMapper.xml

+ 30 - 15
src/main/resources/mapper/CourseMapper.xml

@@ -13,6 +13,7 @@
     <result column="cost" jdbcType="INTEGER" property="cost" />
     <result column="teacher_id" jdbcType="INTEGER" property="teacherId" />
     <result column="teacher_name" jdbcType="VARCHAR" property="teacherName" />
+    <result column="likes" jdbcType="INTEGER" property="likes" />
   </resultMap>
   <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
     delete from course
@@ -43,26 +44,32 @@
     where id = #{id,jdbcType=INTEGER}
   </update>
   <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
-    select c.id, c.name, c.type, c.intro, c.picture, c.school, c.create_time, c.delete_time, c.cost, c.teacher_id, c.teacher_name, t.count as likes
+    select c.id, c.name, c.type, c.intro, c.picture, c.school, c.create_time, c.delete_time, c.cost, c.teacher_id, c.teacher_name, count(t.user_id) as likes
     from course c
-    inner join (select count(*) as count, course_id as id from course_likes group by course_id) as t
-    on c.id = t.id
+    left join course_likes as t
+    on c.id = t.course_id
     where c.id = #{id,jdbcType=INTEGER}
   </select>
   <select id="selectAll" resultMap="BaseResultMap">
-    select c.id, c.name, c.type, c.intro, c.picture, c.school, c.create_time, c.delete_time, c.cost, c.teacher_id, c.teacher_name, t.count as likes
+    select c.id, c.name, c.type, c.intro, c.picture, c.school, c.create_time, c.delete_time, c.cost, c.teacher_id, c.teacher_name, count(t.user_id) as likes
     from course c
-    inner join (select count(*) as count, course_id as id from course_likes group by course_id) as t
-    on c.id = t.id
+    left join course_likes as t
+    on c.id = t.course_id
+    group by c.id
   </select>
   <select id="selectByType" parameterType="java.lang.String" resultMap="BaseResultMap">
-    select id, name, type, intro, picture, school, create_time, delete_time, cost, teacher_id, teacher_name
-    from course
+    select c.id, c.name, c.type, c.intro, c.picture, c.school, c.create_time, c.delete_time, c.cost, c.teacher_id, c.teacher_name, count(t.user_id) as likes
+    from course c
+    left join course_likes as t
+    on c.id = t.course_id
     where type = #{type,jdbcType=VARCHAR}
+    group by c.id
   </select>
   <select id="queryAll" parameterType="java.lang.String" resultMap="BaseResultMap">
-    select id, name, type, intro, picture, school, create_time, delete_time, cost, teacher_id, teacher_name
-    from course
+    select c.id, name, type, intro, picture, school, create_time, delete_time, cost, teacher_id, teacher_name, count(t.user_id) as likes
+    from course c
+    left join course_likes as t
+    on c.id = t.course_id
     <where>
       <if test="name!=null and name!=''">
         or name like concat('%',#{key},'%')
@@ -74,25 +81,33 @@
         or school like concat('%',#{key},'%')
       </if>
     </where>
+    group by c.id
     order by create_time asc
   </select>
   <select id="selectByTeacherId" parameterType="java.lang.Integer" resultMap="BaseResultMap">
-    select c.id, name, type, intro, picture, school, create_time, delete_time, cost, teacher_id, teacher_name
+    select c.id, name, type, intro, picture, school, create_time, delete_time, cost, teacher_id, teacher_name, count(t.user_id) as likes
     from course c
+    left join course_likes t
+    on c.id = t.course_id
     where teacher_id = #{userId}
+    group by c.id
   </select>
   <select id="selectByStudentId" parameterType="java.lang.Integer" resultMap="BaseResultMap">
-    select c.id, name, type, intro, picture, school, create_time, delete_time, cost, teacher_id, teacher_name
+    select c.id, name, type, intro, picture, school, create_time, delete_time, cost, teacher_id, teacher_name, count(t.user_id) as likes
     from course c
+    left join course_likes t
+    on c.id = t.course_id
     where exists (
         select o.id from course_order o where o.course_id = c.id and o.user_id = #{userId}
     )
+    group by c.id
   </select>
   <select id="selectHotCourses" resultType="cn.seecoder.courselearning.po.Course">
-    select c.id, c.name, c.type, c.intro, c.picture, c.school, c.create_time, c.delete_time, c.cost, c.teacher_id, c.teacher_name, t.count as likes
+    select c.id, c.name, c.type, c.intro, c.picture, c.school, c.create_time, c.delete_time, c.cost, c.teacher_id, c.teacher_name, count(t.user_id) as likes
     from course c
-    inner join (select count(*) as count, course_id as id from course_likes group by course_id) as t
-    on c.id = t.id
+    left join course_likes t
+    on c.id = t.course_id
+    group by c.id
     order by likes desc
   </select>
 </mapper>