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、私の組合の後に重複がありますが、異なる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 つと からfacstaff1 つ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 に答える