此查询与子查询一起运行缓慢。我还没有权限创建临时表,但是有没有办法进一步优化这个查询,或者我是否在某个地方使用了损坏的逻辑?
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT
CONCAT( u.firstname , ' ' , u.lastname) as Student_name,
u.id as Student_ID,
FROM_UNIXTIME(u.firstaccess) as first_moodle_access,
FROM_UNIXTIME(u.lastaccess) as last_moodle_access,
FROM_UNIXTIME(last.timeaccess) as last_course_access,
grp.name as Cohorts,
cour.fullname as course
FROM
mdl_user as u
Inner Join mdl_user_lastaccess as last on u.id = last.userid
Inner Join mdl_course as cour on last.courseid = cour.id
Inner Join mdl_groups as grp on cour.id = grp.courseid
WHERE u.lastlogin = (
Select Max(u2.lastlogin)
From mdl_user as u2
where u2.lastlogin = u.lastlogin
)
AND cour.id = '10189' AND
u.firstaccess > '0' AND
u.lastaccess > '0';
最佳答案
相关子查询在大多数情况下效率相当低,您可能会通过交付的表获得更好的性能。 大多数情况下,可以使用 INNER JOIN 重写相关子查询。
我认为你的相关子查询可以重写如下,但你需要检查结果是否相同,因为我不知道你的表结构和数据。
SELECT
CONCAT( u.firstname , ' ' , u.lastname) as Student_name,
u.id as Student_ID,
FROM_UNIXTIME(u.firstaccess) as first_moodle_access,
FROM_UNIXTIME(u.lastaccess) as last_moodle_access,
FROM_UNIXTIME(last.timeaccess) as last_course_access,
grp.name as Cohorts,
cour.fullname as course
FROM
mdl_user as u
Inner Join mdl_user_lastaccess as last on u.id = last.userid
Inner Join mdl_course as cour on last.courseid = cour.id
Inner Join mdl_groups as grp on cour.id = grp.courseid
Inner Join(
Select
Max(lastlogin)
FROM
mdl_user
) AS u2
ON
u.lastlogin = u2.lastlogin
WHERE
cour.id = '10189' AND
u.firstaccess > '0' AND
u.lastaccess > '0';
关于mysql - 带有子查询的查询运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41552178/