我有一个学校的网络应用程序,可以在注册系统时提取学生和教师的位置。这些地点随着时间的推移而变化(学生改变宿舍,工作人员切换建筑物),所以我正在构建一个脚本来偶尔更新它们。我需要运行一个查询,其中包含用户ID和建筑物名称的列表,我想在单个查询中进行个人启发/自虐的原因。
我可以访问具有以下(简化)架构的中央数据库:
facstaff(userid, bldgcode)
students(userid, dorm)
buildings(bldgcode, building) # building is the human readable building name
到目前为止我正在使用的查询看起来像这样:
SELECT users.userid, buildings.building
FROM (SELECT userid, bldgcode FROM facstaff
UNION
SELECT userid, dorm AS bldgcode FROM students)
AS users
INNER JOIN buildings ON users.bldgcode=buildings.bldgcode
WHERE userid in (<list of users>);
我遇到的问题是,许多学生毕业后继续在学校工作(学生在毕业时没有从数据库中删除),或者会同时工作和学习,所以有重复{{1在我的工会之后,但他们有不同的userid
所以一个简单的区别不起作用。基本上我得到这样的结果:
bldgcode
弗雷德里克既是学生又是工作人员,所以两个地方都有他的名字;一个来自+----------+-----------------------+
| userid | building |
+----------+-----------------------+
| jimbo | Science Sphere |
| billiam | Dorm E11 |
| dwayne | Humanities Hall |
| mandar | Science Sphere |
| foobaz | Administration |
| fredrick | Physical Plant |
| fredrick | Dorm A6 |
+----------+-----------------------+
,一个来自facstaff
。理想情况下,有一种方法可以在students
列中强制区分,以便来自userid
的建筑物覆盖来自facstaff
的任何内容。当然,我对其他解决方案持开放态度。我感谢任何帮助!
答案 0 :(得分:4)
如果用户既是教师又是学生,要重新说明您要查找的内容,您希望教师信息优先于学生信息。
要执行此操作,您可以在students
的{{1}}部分添加一项检查,只有在他们不是教职员工的情况下才会返回该项目 - 通过UNION
在此处实施:
LEFT JOIN / IS NULL