2017-03-29 30 views
0

JOINの概念を説明するチュートリアルや例が多数ありますが、私は特定のシナリオに例を適用するのに苦労しています。私はいくつかの助けに感謝し、もしそれがあまりにも多くのことを求めていないなら、望ましい結果を達成するために解決策において何が起こっているのかを打破してください。3つのテーブルから行を選択する

3テーブル:ユーザー、評価、assessment_log。

ユーザー

+--------+------+------+-----------+----------+-----------+-------+--------+-----------+---------------+------+----------+ 
| UserID | User | Pass | FirstName | LastName | LastLogin | Email | Mobile | Kenitalla | AccountStatus | Role | Operator | 
+--------+------+------+-----------+----------+-----------+-------+--------+-----------+---------------+------+----------+ 

評価

+--------------+------+-----------+-----------+-----------+-----------+-----------+--------------+----------+---------+----------+ 
| AssessmentID | Name | Criteria1 | Criteria2 | Criteria3 | Criteria4 | Criteria5 | RoleRequired | Required | Renewal | Operator | 
+--------------+------+-----------+-----------+-----------+-----------+-----------+--------------+----------+---------+----------+ 

assessment_logs

+-----------------+------+----------------+------------+--------+-----------+----------+----------+----------+----------+----------+----------+---------+---------------+---------+ 
| AssessmentLogID | Date | AssessmentName | AssessedBy | UserID | StaffName | Comments | Verdict1 | Verdict2 | Verdict3 | Verdict4 | Verdict5 | Verdict | RenewalPeriod | NextDue | 
+-----------------+------+----------------+------------+--------+-----------+----------+----------+----------+----------+----------+----------+---------+---------------+---------+ 

ユーザーが評価を取り、エントリがassessment_logにして行きます。一部の評価は必須です(必須の列では真または偽)。 RoleRequired列には、評価が必要なユーザーロールが指定されています。

まだ受け入れていないユーザーと評価のリストを生成したいと思います。アセスメントは必須であり、必要な役割はユーザーの役割と一致する必要があります。評決列に「合格」と記載されたassessment_logへの入力がない場合、評価がまだ合格していないことを示します。平野話すに

、私は次のような結果を達成しますクエリを探しています:

+------------------+-----------------+----------------+ 
| assessments.Name | users.FirstName | users.LastName | 
+------------------+-----------------+----------------+ 

評価が必要です(必須真等しい)、RequiredRoleはusers.Role列に一致し、そこに「評価」列に「合格」値がある評価については、assessmentments_logには記入されていません。

さらなる説明が必要な場合は教えてください。

ありがとうございます!

答えて

0

LEFT JOINを使用することをおすすめします。

まず、評価とユーザーのクロスプロダクトを生成します。ユーザーには、ユーザーの役割に必要なすべての評価が含まれています。

LEFT JOINは、これらの評価が合格したかどうかを確認します。

SELECT ... 
FROM 
    users u 
    JOIN assessments a ON (a.RoleRequired = u.Role) 
    LEFT JOIN assessment_logs al ON (
      al.AssessmentID = a.AssessmentID 
     AND al.UserID = u.UserID 
     AND al.Verdict='Pass' 
    ) 

WHERE 
     a.required 
    AND al.UserID IS NULL 
+0

これは私がそのためにあなたに感謝expect-結果を与えるようです! LEFT JOINを詳しく見ていきます...あなたの明確な例と説明でも、私はそのコンセプトに苦しんでいます。 LEFT JOINに追加の基準をチェーンしているかのように思えます。読んでいる例は、あるテーブルから行を選択し、行が一致する2番目のテーブル(右側)から行を戻すことです。 "AND al.UserID = u.UserID"と "AND al。Verdict = 'Pass' "クエリの部分? –

+0

http://www.mysqltutorial.org/mysql-left-join.aspx通常の(内部)結合と同じように動作します。したがって、LEFT JOIN B ON(cond)WHERE b.id IS NULLは、b内の行がない(cond)行を返します。とった? – peufeu

0

あなたの属性名は、テーブル間の矛盾していると、私は任意の重複した名前が表示されませんが、あなたが前にそれはおそらく時間の問題だ、私はあなたがこれを修正示唆しています。一方

は、ここに結合構文を簡単にするためにその場で列の名前を変更する方法は次のとおりです。

SELECT AssessmentName, UserLastName, UserFirstName 
    FROM (SELECT FirstName AS UserFirstName, Lastname AS UserLastName, Role 
      FROM users) u 
     NATURAL JOIN 
     { SELECT Name AS AssessmentName, RoleRequired AS Role 
      FROM assessments 
      WHERE Required) a 
     NATURAL JOIN 
     (SELECT AssessmentName 
      FROM assessment_logs 
      WHERE Verdict = 'Pass') l; 
関連する問題