如何在SQL中的查询中区分单个列?

时间:2013-10-16 23:32:14

标签: mysql sql database

我有一个学校的网络应用程序,可以在注册系统时提取学生和教师的位置。这些地点随着时间的推移而变化(学生改变宿舍,工作人员切换建筑物),所以我正在构建一个脚本来偶尔更新它们。我需要运行一个查询,其中包含用户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的任何内容。当然,我对其他解决方案持开放态度。我感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

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

要执行此操作,您可以在students的{​​{1}}部分添加一项检查,只有在他们不是教职员工的情况下才会返回该项目 - 通过UNION在此处实施:

LEFT JOIN / IS NULL