1

我有一个学校的 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。当然,我对其他解决方案持开放态度。我很感激任何帮助!

4

1 回答 1

4

重新表述您要查找的内容,如果用户既是教师又是学生,您希望教师信息优先于学生信息。

为此,您可以在students您的部分添加一个检查,UNION以仅在学生不是教员的情况下返回学生 - 在此处实现LEFT JOIN / IS NULL

SELECT users.userid, buildings.building 
FROM (
  SELECT userid, bldgcode FROM facstaff 
  UNION 
  SELECT userid, dorm AS bldgcode FROM students
  LEFT JOIN facstaff ON facstaff.userid = students.userid
  WHERE facstaff.userid IS NULL
) AS users
  INNER JOIN buildings ON users.bldgcode=buildings.bldgcode 
WHERE userid in (<list of users>);
于 2013-10-16T23:43:10.190 回答