システムに登録するときに、学生と教職員の両方の場所を取得する学校用の 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
、私の組合の後に重複がありますが、異なるbldgcode
ため、単純な個別は機能しません。基本的に、次のような結果が得られます。
+----------+-----------------------+
| userid | building |
+----------+-----------------------+
| jimbo | Science Sphere |
| billiam | Dorm E11 |
| dwayne | Humanities Hall |
| mandar | Science Sphere |
| foobaz | Administration |
| fredrick | Physical Plant |
| fredrick | Dorm A6 |
+----------+-----------------------+
Fredrick は学生であり、職員でもあるため、2 つの場所で彼の名前が思いつきます。から 1 つと からfacstaff
1 つstudents
。理想的には、列に区別を適用する方法があり、そこuserid
から来る建物が から来るものfacstaff
を上書きするようになりますstudents
。もちろん、私は他のソリューションにもオープンです。どんな助けにも感謝します!