MDL-50145 mod_lesson: fixed issue with duplicate values

This commit is contained in:
Mark Nelson
2015-06-08 22:09:25 -07:00
parent 17abbfba1f
commit 2c4b43d9b2
+38 -18
View File
@@ -437,28 +437,48 @@ function lesson_print_overview($courses, &$htmlarray) {
}
// Get the last page viewed by the current user for every lesson in this course.
list($insql, $inparams) = $DB->get_in_or_equal($listoflessons, SQL_PARAMS_NAMED);
$dbparams = array_merge($inparams, array('userid1' => $USER->id, 'userid2' => $USER->id));
$dbparams = array_merge($inparams, array('userid' => $USER->id));
$lastattempts = $DB->get_records_sql("SELECT l.id, l.timeseen,l.lessonid, l.userid,
l.retry, l.pageid, l.nextpageid, p.qtype FROM (
SELECT lessonid, userid, pageid, timeseen, retry, id, answerid AS nextpageid
FROM {lesson_attempts}
WHERE userid = :userid1
UNION
SELECT lessonid, userid, pageid, timeseen, retry, id, nextpageid
FROM {lesson_branch}
WHERE userid = :userid2) l
JOIN {lesson_pages} p
ON l.pageid = p.id
WHERE l.lessonid $insql
ORDER BY l.lessonid asc, l.timeseen desc", $dbparams);
// Get the lesson attempts for the user that have the maximum 'timeseen' value.
$select = "SELECT l.id, l.timeseen, l.lessonid, l.userid, l.retry, l.pageid, l.answerid as nextpageid, p.qtype ";
$from = "FROM {lesson_attempts} l
JOIN (
SELECT idselect.lessonid, idselect.userid, MAX(idselect.id) AS id
FROM {lesson_attempts} idselect
JOIN (
SELECT lessonid, userid, MAX(timeseen) AS timeseen
FROM {lesson_attempts}
WHERE userid = :userid
AND lessonid $insql
GROUP BY userid, lessonid
) timeselect
ON timeselect.timeseen = idselect.timeseen
AND timeselect.userid = idselect.userid
AND timeselect.lessonid = idselect.lessonid
GROUP BY idselect.userid, idselect.lessonid
) aid
ON l.id = aid.id
JOIN {lesson_pages} p
ON l.pageid = p.id ";
$lastattempts = $DB->get_records_sql($select . $from, $dbparams);
// Now, get the lesson branches for the user that have the maximum 'timeseen' value.
$select = "SELECT l.id, l.timeseen, l.lessonid, l.userid, l.retry, l.pageid, l.nextpageid, p.qtype ";
$from = str_replace('{lesson_attempts}', '{lesson_branch}', $from);
$lastbranches = $DB->get_records_sql($select . $from, $dbparams);
$lastviewed = array();
foreach ($lastattempts as $lastattempt) {
if (!isset($lastviewed[$lastattempt->lessonid])) {
$lastviewed[$lastattempt->lessonid] = $lastattempt;
} else if ($lastviewed[$lastattempt->lessonid]->timeseen < $lastattempt->timeseen) {
$lastviewed[$lastattempt->lessonid] = $lastattempt;
$lastviewed[$lastattempt->lessonid] = $lastattempt;
}
// Go through the branch times and record the 'timeseen' value if it doesn't exist
// for the lesson, or replace it if it exceeds the current recorded time.
foreach ($lastbranches as $lastbranch) {
if (!isset($lastviewed[$lastbranch->lessonid])) {
$lastviewed[$lastbranch->lessonid] = $lastbranch;
} else if ($lastviewed[$lastbranch->lessonid]->timeseen < $lastbranch->timeseen) {
$lastviewed[$lastbranch->lessonid] = $lastbranch;
}
}