0

現在、次のSQLステートメントがあります。

SELECT s.first_name, s.last_name, tgs.group_identifier
FROM staff s
JOIN staff_training st
ON s.staff_id = st.staff_id
JOIN training_group_staff tgs
ON st.staff_training_id = tgs.staff_training_id
WHERE st.staff_course_id = '164'

training_group_staffstaff_training_idおよびのみが含まれますtraining_group_id

このステートメントは期待どおりに機能し、コース164に参加し、グループに配置されたすべてのスタッフ名を返します(group_identifierフィールドで識別されます)。

私がやろうとしているのは、トレーニングコース164のすべてのユーザーを表示し、グループが選択されていない場合(の特定の行がない場合staff_training_idtraining_group_staff、その列にnullを返します。

視覚的な例

現在のステートメントの戻り値:

first_name  |  last_name  |  group_identifier
 Jim        |   Jones     |   3
 Harry      |   Jones     |   6

私が返そうとしているのは:

first_name  |  last_name  |  group_identifier
 Jim        |   Jones     |   3
 Harriet    |   Smith     |   NULL   // No row in training_group_staff
 Harry      |   Jones     |   6

いくつかの結合を試しましたが、同じ結果が返されるようです-1つのクエリで目的の出力が可能ですか?

4

3 に答える 3

2

で試してくださいLEFT JOIN。あなたが求めているものでなければなりません。

于 2012-05-08T14:46:58.263 に答える
1

2つのこと:

  1. テーブルLEFT JOINを結合するときに明示的なものを使用してみてくださいtraining_group_staff
  2. 値が空であるかどうかを確認し、値をに設定するIFステートメントnull
SELECT s.first_name    
    , s.last_name    
    , IF(tgs.group_identifier = '', null, group_identifier) AS group_identifier    
FROM staff s    
JOIN staff_training st    
ON s.staff_id = st.staff_id    
LEFT JOIN training_group_staff tgs    
ON st.staff_training_id = tgs.staff_training_id    
WHERE sm.staff_course_id = '164'
于 2012-05-08T14:46:58.357 に答える
1

次の操作を含める場合は、外部結合を使用します。NULLJOIN

SELECT s.first_name, s.last_name, tgs.group_identifier
FROM staff s
JOIN staff_training st
JOIN ON s.staff_id = st.staff_id
LEFT OUTER JOIN training_group_staff tgs
ON st.staff_training_id = tgs.staff_training_id
WHERE st.staff_course_id = '164'
于 2012-05-08T14:47:29.383 に答える