我有一个学校的 web 应用程序,它在学生和教职员工注册系统时提取他们的位置。不过,这些位置会随着时间而变化(学生换宿舍,员工换楼),所以我正在构建一个脚本来偶尔更新它们。我需要运行一个查询来获取用户 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>);
我遇到的问题是很多学生毕业后继续在学校工作(学生条目在毕业时不会从数据库中删除),或者会同时工作和学习,所以userid
在我的工会之后有重复,但他们have differentbldgcode
所以简单的 distinct 不起作用。基本上我得到这样的结果:
+----------+-----------------------+
| userid | building |
+----------+-----------------------+
| jimbo | Science Sphere |
| billiam | Dorm E11 |
| dwayne | Humanities Hall |
| mandar | Science Sphere |
| foobaz | Administration |
| fredrick | Physical Plant |
| fredrick | Dorm A6 |
+----------+-----------------------+
Fredrick 既是学生又是工作人员,所以他的名字有两个地方出现;一个来自facstaff
一个来自students
。理想情况下,有一种方法可以在userid
列中强制区分,以便来自的建筑物facstaff
将覆盖来自 的任何内容students
。当然,我对其他解决方案持开放态度。我很感激任何帮助!