340 lines
12 KiB
XML
Raw Permalink Normal View History

2026-03-10 14:30:24 +08:00
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="HearAnswer">
<insert id="insertHearAnswer" parameterType="HearAnswer">
INSERT INTO HearAnswer ( examAnswerId, userId, examId, examType,
hearPaperId, score, answerDetail, created, areaId , origiScore , trueScore )
Values ( #{examAnswerId}, #{userId}, #{examId}, #{examType},
#{hearPaperId}, #{score}, #{answerDetail},current_timestamp,
#{areaId} , #{origiScore} , #{trueScore} )
</insert>
<update id="updateHearAnswer" parameterType="HearAnswer">
UPDATE HearAnswer
SET examAnswerId = #{examAnswerId}, userId = #{userId},
examId = #{examId}, examType = #{examType},
hearPaperId = #{hearPaperId}, score = #{score},
answerDetail = #{answerDetail}, created = #{created},
areaId = #{areaId} , origiScore = #{origiScore}
WHERE examAnswerId=#{examAnswerId}
</update>
<select id="getHearAnswerByKey" parameterType="java.lang.Integer" resultType="HearAnswer">
SELECT examAnswerId , userId , examId , examType , hearPaperId ,
score , answerDetail , created , areaId , origiScore
FROM HearAnswer
WHERE examAnswerId=#{examAnswerId}
</select>
<select id="getSeqHearAnswer" resultType="Long" useCache="false" flushCache="true">
SELECT nextval('seq_hearAnswerId')
</select>
<select id="getHearAnswersCountByUserId" parameterType="java.lang.Long" resultType="Integer">
SELECT count(*) as howmuch
FROM HearAnswer
WHERE userId=#{userId}
</select>
<select id="getHearAnswersByUserId" parameterType="java.util.Map" resultType="HearAnswer">
SELECT examAnswerId , userId , examId , examType , hearPaperId ,
score , answerDetail , created , areaId , origiScore
FROM HearAnswer
WHERE userId=#{userId}
AND created &gt; #{startTime} and created &lt;= #{endTime}
ORDER BY examAnswerId desc
<if test="pageSize!=null">
limit #{pageSize}
</if>
<if test="offset!=null">
offset #{offset}
</if>
</select>
<select id="getMaxHearAnswersCountByClassesId" parameterType="java.util.Map" resultType="Integer">
<!-- SELECT count(*) from StudentOwnClass where classesId = #{classesId} and status=1 -->
select count(soc.studentId ) from studentownclass soc
inner join student s on soc.studentid=s.studentid and s.status=1 and soc.areaid=#{areaid} and s.areaid=#{areaid}
where soc.classesId=#{classesId} and soc.status=1
<!-- FROM ( SELECT userId , max( score ) as maxScore
FROM StudentOwnClass m
INNER JOIN hearAnswer n
ON m.classesId = #{classesId} AND m.studentId = n.userId
AND examId = #{examId}
GROUP BY userId ) as a -->
</select>
<select id="getMaxHearAnswersByClassesId" parameterType="java.util.Map" resultType="ExamAchive">
with stu as(select soc.studentId userId from studentownclass soc
inner join student s on soc.studentid=s.studentid and s.status=1
where soc.classesId=#{classesId} and soc.status=1)
SELECT stu.userId , b.examAnswerId , b.examId , b.examType ,
b.hearPaperId as examPaperId , b.score , b.created ,
case when b.score &gt;= 85 then 'A'
when b.score &gt;= 80 then 'B'
when b.score &gt;= 70 then 'C'
when b.score &gt;= 60 then 'D'
else 'E' end as level
, e.title,b.trueScore
FROM ( SELECT userId , examId ,
last_value( examAnswerId ) OVER (PARTITION BY userId order by score desc ) as tempId ,
row_number() OVER (PARTITION BY userId order by score desc ) as rn
FROM StudentOwnClass m
INNER JOIN HearAnswer n
ON m.classesId = #{classesId} AND m.studentId = n.userId AND examId = #{examId}
) a
INNER JOIN HearAnswer b
ON a.tempId = b.examAnswerId and a.rn = 1 and b.areaid = #{areaid}
inner join HearExam e on e.examId = b.examId
right join stu on stu.userId=b.userId
ORDER BY b.score desc nulls last,b.created asc nulls last ,stu.userId
<if test="pageSize!=null">
limit #{pageSize}
</if>
<if test="offset!=null">
offset #{offset}
</if>
</select>
<select id="getHearAnswersCountByClassesId" parameterType="java.util.Map" resultType="Integer">
SELECT count(*)
FROM StudentOwnClass a
INNER JOIN hearAnswer b
ON a.classesId = #{classesId} AND a.studentId = b.userId
AND b.examId = #{examId} and b.areaid = #{areaid}
</select>
<select id="getHearAnswersByClassesId" parameterType="java.util.Map" resultType="ExamAchive">
SELECT b.userId , b.examAnswerId , b.examId , b.examType ,
b.hearPaperId as examPaperId , b.score , b.created ,
case when b.score &gt;= 85 then 'A'
when b.score &gt;= 80 then 'B'
when b.score &gt;= 70 then 'C'
when b.score &gt;= 60 then 'D'
else 'E' end as level
, e.title,b.trueScore
FROM StudentOwnClass a
INNER JOIN hearAnswer b
ON a.classesId = #{classesId} AND a.studentId = b.userId
AND b.examId = #{examId} and b.areaId=#{areaid}
inner join hearExam e on e.examId = b.examId
ORDER BY b.examAnswerId desc
<if test="pageSize!=null">
limit #{pageSize}
</if>
<if test="offset!=null">
offset #{offset}
</if>
</select>
<select id="getMaxHearAchivesCountByUserId" parameterType="java.util.Map" resultType="Integer">
<!-- <![CDATA[
SELECT count(*)
FROM ( SELECT examId , max( score ) as maxScore
FROM hearAnswer n
WHERE n.userId = #{userId}
GROUP BY examId , ) a
INNER JOIN hearAnswer b
ON b.userId = #{userId} and a.examId = b.examId
and a.maxScore = b.score and b.areaid = #{areaid}
AND b.created > #{startTime} and b.created <= #{endTime}
]]> -->
SELECT count( distinct examid )
FROM hearAnswer
WHERE userId = #{userId}
and areaid=#{areaid}
AND created &gt; #{startTime} and created &lt;= #{endTime}
</select>
<select id="getMaxHearAchivesByUserId" parameterType="java.util.Map" resultType="ExamAchive">
SELECT b.userId , b.examAnswerId , b.examId , b.examType ,
b.hearPaperId as examPaperId , b.score , b.created ,
case when b.score &gt;= 85 then 'A'
when b.score &gt;= 80 then 'B'
when b.score &gt;= 70 then 'C'
when b.score &gt;= 60 then 'D'
else 'E' end as level
, e.title
FROM ( SELECT userId , examAnswerId , examId , examType ,
hearPaperId , score , created ,
rank() over (partition by examId order by score desc , created desc ) as mm
FROM hearANSWER
WHERE userId = #{userId}
and areaId=#{areaid}
AND created &gt; #{startTime} and created &lt;= #{endTime}
) b
INNER JOIN HearExam e
on b.examId = e.examId
WHERE b.mm = 1
ORDER BY b.examId desc
<if test="pageSize!=null">
limit #{pageSize}
</if>
<if test="offset!=null">
offset #{offset}
</if>
<!-- SELECT b.userId , b.examAnswerId , b.examId , b.examType ,
b.hearPaperId as examPaperId , b.score , b.created ,
<![CDATA[
case when b.score >= 85 then 'A'
when b.score >= 73 then 'B'
when b.score >= 60 then 'C'
when b.score >= 45 then 'D'
else 'E' end as level
]]> , e.title
FROM ( SELECT examId , max( score ) as maxScore
FROM hearAnswer n
WHERE n.userId = #{userId}
GROUP BY examId ) a
INNER JOIN hearAnswer b
ON b.userId = #{userId} and a.examId = b.examId
and a.maxScore = b.score and b.areaid = #{areaid}
inner join HearExam e on e.examId = b.examId
<![CDATA[
AND b.created > #{startTime} and b.created <= #{endTime}
]]>
ORDER BY a.examId desc
<dynamic>
<isNotEmpty prepend=" LIMIT " property="pageSize">
#{pageSize}
</isNotEmpty>
<isNotEmpty prepend=" OFFSET " property="offset">
#{offset}
</isNotEmpty>
</dynamic> -->
</select>
<select id="getHearAchivesCountByUserId" parameterType="java.util.Map" resultType="Integer">
SELECT count(*)
FROM hearAnswer b
WHERE b.userId = #{userId} and b.areaid = #{areaid}
AND b.created &gt; #{startTime} and b.created &lt;= #{endTime}
</select>
<select id="getHearAchivesByUserId" parameterType="java.util.Map" resultType="ExamAchive">
SELECT b.userId , b.examAnswerId , b.examId , b.examType ,
b.hearPaperId as examPaperId , b.score , b.created ,
case when b.score &gt;= 85 then 'A'
when b.score &gt;= 80 then 'B'
when b.score &gt;= 70 then 'C'
when b.score &gt;= 60 then 'D'
else 'E' end as level
, e.title
FROM hearAnswer b inner join hearExam e on e.examId = b.examId
WHERE b.userId = #{userId} and b.areaid = #{areaid}
AND b.created &gt; #{startTime} and b.created &lt;= #{endTime}
ORDER BY b.examAnswerId desc
<if test="pageSize!=null">
limit #{pageSize}
</if>
<if test="offset!=null">
offset #{offset}
</if>
</select>
<select id="getHearCountByExamIdByUserId" parameterType="java.util.Map" resultType="Integer">
select count(*)
from hearanswer
where examid = #{examId} and userid = #{userId}
and areaId=#{areaId}
</select>
<select id="getMaxHearAnswersCountByClassesIdFilter" parameterType="java.util.Map" resultType="Integer">
with temp as(SELECT userId , score,
row_number() OVER (PARTITION BY userId order by score desc , created asc ) as rn
FROM StudentOwnClass m
INNER JOIN HEARANSWER n
ON m.classesId = #{classesId}
AND m.studentId = n.userId AND examId = #{examId}
and m.areaId=#{areaid} and n.areaId=#{areaid} )
select count(userId) from temp where rn=1
<if test="upperScore!=null">
and score&lt;#{upperScore}
</if>
<if test="lowerScore!=null">
and score&gt;#{lowerScore}
</if>
</select>
<select id="getMaxHearAnswersByClassesIdFilter" parameterType="java.util.Map" resultType="ExamAchive">
with stu as(select soc.studentId userId from studentownclass soc
inner join student s on soc.studentid=s.studentid and s.status=1
where soc.classesId=#{classesId} and s.areaid=#{areaid} and soc.areaid=#{areaid} and soc.status=1 ) ,
SELECT stu.userId , b.examAnswerId , b.examId , b.examType ,
b.examPaperId , b.score , b.created ,
case when b.score &gt;= 85 then 'A'
when b.score &gt;= 80 then 'B'
when b.score &gt;= 70 then 'C'
when b.score &gt;= 60 then 'D'
else 'E' end as level
, e.title , b.trueScore , b.machineScore , b.humanScore,
b.origiScore
FROM ( SELECT userId , examId ,
examAnswerId as tempId ,
row_number() OVER (PARTITION BY userId order by score desc , created asc ) as rn
FROM StudentOwnClass m
INNER JOIN EXAMANSWER n
ON m.classesId = #{classesId} AND m.studentId = n.userId AND examId = #{examId} and m.areaId=#{areaid} and n.areaId=#{areaid}
) a
INNER JOIN hearAnswer b
ON a.tempId = b.examAnswerId and a.rn = 1 and b.areaid = #{areaid}
<if test="upperScore!=null">
and b.score&lt;#{upperScore}
</if>
<if test="lowerScore!=null">
and b.score&gt;#{lowerScore}
</if>
inner join Exam e on e.examId = b.examId
inner join stu on stu.userId = b.userId
ORDER BY b.score desc nulls last, b.created asc nulls last,stu.userId
<if test="pageSize!=null">
limit #{pageSize}
</if>
<if test="offset!=null">
offset #{offset}
</if>
</select>
</mapper>