Mysql入门系列:MYSQL解决方案随笔
2006-12-31 10:46:19 来源:WEB开发网我们想要的这种组合是所有学生/事件的组合,它们由student 表与event 表的叉积产生:
FROM student, event
然后我们取出此连接的结果,与score 表执行一个LEFT JOIN 语句找出匹配者:
FROM student, event
LEFT JOIN score ON student.student_id = score.student.id
AND event.event_id = score.event_id
请注意,ON 子句使得score 表中的行根据不同表中的匹配者进行连接。这是解决本问题的关键。LEFT JOIN 强制为由student 和event 表的叉连接生成的每行产生一个行,即使没有相应的score 表记录也是这样。这些缺少的学分记录的结果行可通过一个事实来识别,就是来自score 表的列将全是NULL 的。我们可在WHERE 子句中选出这些记录。来自score 表的任何列都是这样,但因为我们查找的是缺少的学分,测试score 列从概念上可能最为清晰:
WHERE score.score IS NULL
可利用ORDER BY 子句对结果进行排序。两种最合理的排序分别是按学生和按事件进行,我们选择第一种:
ORDER BY student.student_id, event.event_id
现在需要做的就是命名我们希望在输出结果中看到的列。最终的查询如下:
SELECT
student.name, student.student_id,
event.date, event,event_id, event.type
FROM
student,event
LEFT JOIN score ON student.student_id = score.student_id
AND event.event_id = score.event_id
WHERE
score.score IS NULL
ORDER BY
student.student_id, event.event_id
运行此查询得出如下结果:
更多精彩
赞助商链接