2014-03-24 48 views
0

我的SQL在没有研究它2年后有点生疏,所以我无法找到一种方法来执行此操作。将2个SQL查询与公共字段和AVG合并

我需要从Moodle数据库获取一些数据,即学生评定其教师的反馈测试的平均值。

此SQL查询:

SELECT mdl_course.id, mdl_user.username FROM mdl_course 
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id 
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid 
INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid 
INNER JOIN mdl_user ON mdl_user.id = mdl_role_assignments.userid 
WHERE mdl_role.id = 3 

回报这样的事情,以每门课程并作为其分配给老师的表。

COURSE_ID TEACHER 
2   john 
3   mary 
4   john 

现在,我的第二个SQL是这样的:

SELECT mdl_feedback.course, AVG(mdl_feedback_value.value) as average 
FROM mdl_feedback_value 
INNER JOIN mdl_feedback_item ON mdl_feedback_value.item = mdl_feedback_item.id 
INNER JOIN mdl_feedback ON mdl_feedback.id = mdl_feedback_item.feedback 
INNER JOIN mdl_feedback_completed ON mdl_feedback.id = mdl_feedback_completed.feedback 
INNER JOIN mdl_user ON mdl_feedback_completed.userid = mdl_user.id 
GROUP BY mdl_feedback.course 

COURSE AVERAGE 
2   3.5 
3   3 
4   3.25 

我想对那些2个SQL查询作为重点

合并成一个是这样的,当然使用/ COURSE_ID
TEACHER AVERAGE 
john   3,375 <--- avg of 3,5 and 3,25 from each of john's courses 
mary   3  <--- she has just one course so no math here 

我不知道如何去做这件事,所以我很感激一点帮助:)正如我所说,我有一段时间没有使用SQL,所以我并不热衷于这些JOIN事情,也许我必须像在这里使用它们一样使用它们。

我正在使用MySQL 5.5.33,尽管这与Moodle有关,但答案并非真正以Moodle为中心,因为这里唯一重要的是两个查询的输出是什么表。

感谢

回答

1

如果你把每个子查询,然后尝试加入他们的行列,它应该工作。我添加了第三个字段,以帮助您查看创建乐谱的详细信息。

SELECT username, AVG(average) AS average 
    , GROUP_CONCAT(CONCAT('Course: ', teachers.course_id,' with score ', COALESCE(average,'No Score Found'))) AS detail 
FROM (
    SELECT mdl_course.id AS course_id, mdl_user.username AS username 
    FROM mdl_course 
    INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id 
    INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid 
    INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid 
    INNER JOIN mdl_user ON mdl_user.id = mdl_role_assignments.userid 
    WHERE mdl_role.id = 3) AS teachers 
LEFT JOIN (
    SELECT mdl_feedback.course AS course_id, AVG(mdl_feedback_value.value) as average 
    FROM mdl_feedback_value 
    INNER JOIN mdl_feedback_item ON mdl_feedback_value.item = mdl_feedback_item.id 
    INNER JOIN mdl_feedback ON mdl_feedback.id = mdl_feedback_item.feedback 
    INNER JOIN mdl_feedback_completed ON mdl_feedback.id = mdl_feedback_completed.feedback 
    INNER JOIN mdl_user ON mdl_feedback_completed.userid = mdl_user.id 
    GROUP BY mdl_feedback.course) AS scores 
    ON teachers.course_id = scores.course_id 
GROUP BY username 
+0

我不确定如何解决这个问题,但我看到你的左连接,我将在下一次遇到像这样的挑战时使用 – fernandopcg

0

我想使用一个临时表来存储两个不同的查询结果集,然后后,我查询临时表中得到老师的平均值。希望这可以工作。

CREATE TABLE #TEMP 
(
COURSE_ID int, 
TEACHER varchar(100), 
COURSE int, 
AVERAGE int 
) 
--- Inserting the course_id and Teahcer data---- 

INSERT INTO #TEMP 
(
COURSE_ID, 
TEACHER 
) 
SELECT mdl_course.id, mdl_user.username FROM mdl_course 
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id 
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid 
INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid 
INNER JOIN mdl_user ON mdl_user.id = mdl_role_assignments.userid 
WHERE mdl_role.id = 3 

-- Inserting the course and average data--- 
INSERT INTO #TEMP 
(
COURSE, 
AVERAGE 
) 
SELECT mdl_feedback.course, AVG(mdl_feedback_value.value) as average 
FROM mdl_feedback_value 
INNER JOIN mdl_feedback_item ON mdl_feedback_value.item = mdl_feedback_item.id 
INNER JOIN mdl_feedback ON mdl_feedback.id = mdl_feedback_item.feedback 
INNER JOIN mdl_feedback_completed ON mdl_feedback.id = mdl_feedback_completed.feedback 
INNER JOIN mdl_user ON mdl_feedback_completed.userid = mdl_user.id 
GROUP BY mdl_feedback.course 


--- Querying the # temp table for the average and teacher--- 

SELECT TEACHER, AVG(AVERAGE) 
FROM #TEMP 
GROUP BY TEACHER 
+0

我宁愿没有创建一个新的临时表(我不知道你是否已经看到Moodle的架构,但它是可怕的,充满临时表之类的东西),所以我会好好清洁的方式。无论如何感谢 – fernandopcg

+0

@fernandopcg:哦,我没有看到它,但这是一个失去知识的解决方案。你试过这个吗? –

+0

我试过了,但是当我在PHPMyAdmin中提交它时,它说'#1064 - 你的SQL语法有错误; (COURSE_ID int,TEACHER varchar(100),COURSE int,AVERAGE int)--- Inser'at line 2'处检查正确的语法对应的MySQL服务器版本的手册。我没有看过它,但它可能是一个错字或类似的东西 – fernandopcg

0

你可以尝试使用

INNER JOIN mdl_course ON mdl_feedback.course = mdl_course.id 

请看看这个组合查询工作连接两个疑问:

SELECT mdl_user.username, AVG(mdl_feedback_value.value) as average 
FROM mdl_feedback_value 
INNER JOIN mdl_feedback_item ON mdl_feedback_value.item = mdl_feedback_item.id 
INNER JOIN mdl_feedback ON mdl_feedback.id = mdl_feedback_item.feedback 
INNER JOIN mdl_feedback_completed ON mdl_feedback.id = mdl_feedback_completed.feedback 
INNER JOIN mdl_user ON mdl_feedback_completed.userid = mdl_user.id 
INNER JOIN mdl_course ON mdl_feedback.course = mdl_course.id 
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id 
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid 
INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid 
INNER JOIN mdl_user ON mdl_user.id = mdl_role_assignments.userid 
WHERE mdl_role.id = 3 
GROUP BY mdl_user.username;