MySQL嵌套查询格式

问题描述:

我有一个带有3个表格的数据库,A VOLUNTEER表格,TRAINING_EVENTS表格和TRAINING_INSTRUCTOR表格。MySQL嵌套查询格式

VOLUNTEER表格包含有关人标记为自动递增的Vol_ID的信息。

TRAINING_EVENTS表包含由自动递增的Event_ID标记的事件的日期和时间。它还为每个活动分配一个Hours_Credited字段,该字段表示志愿者获得多少学分作为该特定活动的指导员的学分。

TRAINING_INSTRUCTOR表包含Vol_IDEvent_id。 (表明哪个志愿者是一个活动的指导员)。

我想有一个认定其特定事件的志愿者是在教练,然后添加了贷记小时为这些事件

下面的代码查询是什么,我尝试使用,但结果在错误。

SELECT SUM(Hours_Credited) 
FROM TRAINING_EVENTS AS TE, TRAINING_INSTRUCTOR AS TI 
WHERE TE.EVENT_ID = TI.EVENT_ID AND TI.EVENT_ID IN 
    (SELECT TI.EVENT_ID 
    FROM VOLUNTEER AS V, TRAINING_INSTRUCTOR AS TI 
    WHERE V.VOL_ID = TI.VOL_ID AND V.VOL_ID = 3); 
+0

您使用了'TI'作为别名两次:一个在外部,内部查询 – Psi

您的IN查询中别名TI重新使用。

试试这个与TI2名称...

SELECT SUM(Hours_Credited) 
FROM TRAINING_EVENTS AS TE, TRAINING_INSTRUCTOR AS TI 
WHERE TE.EVENT_ID = TI.EVENT_ID AND TI.EVENT_ID IN 
(SELECT TI2.EVENT_ID 
FROM VOLUNTEER AS V, TRAINING_INSTRUCTOR AS TI2 
WHERE V.VOL_ID = TI2.VOL_ID AND V.VOL_ID = 3); 
+0

谢谢你的帮助。这工作完美。 – user5865015

编辑,以去除多余的加盟TI和拉所有VOL_IDs。

SELECT TI.VOL_ID, SUM(TE.Hours_Credited) as HOURS_CREDITED 
FROM TRAINING_EVENTS AS TE, 
(SELECT TI.EVENT_ID, TI.VOL_ID 
    FROM VOLUNTEER AS V, TRAINING_INSTRUCTOR AS TI 
    WHERE V.VOL_ID = TI.VOL_ID) AS TI 
WHERE TE.EVENT_ID = TI.EVENT_ID 
GROUP BY TI.VOL_ID 
ORDER BY TI.VOL_ID; 
+0

您也可以使用正确的'join'语法获得很好的答案 – Psi

+0

谢谢。这非常有帮助。 – user5865015

可以使用JOIN做到这一点:由志愿者

SELECT v.NAME, SUM(Hours_Credited) as 'Hours_Credited' 
FROM TRAINING_INSTRUCTOR TI 
join TRAINING_EVENTS TE 
on TI.Event_ID = TE.Event_ID 
join VOLUNTEER V 
on TI.VOL_ID = V.VOL_ID 
group by V.VOL_ID 

你可以在这里尝试http://sqlfiddle.com/#!9/b9694a/4

如果有输入VOL_ID并且要输出HOURS_CREDITED的总和,此查询将解析:

SELECT SUM(TE.Hours_Credited) 
FROM 
TRAINING_EVENTS AS TE, TRAINING_INSTRUCTOR AS TI 
WHERE 
TE.EVENT_ID = TI.EVENT_ID AND TI.VOL_ID = 3;