2017-03-29 7 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에 추가 기준을 연결 한 것처럼 보입니다. 내가 읽은 예제는 한 테이블에서 행을 선택하고 행이 일치하는 두 번째 테이블 (오른쪽)에서 행을 반환하는 것과 관련이 있습니다. "AND al.UserID = u.UserID"및 "AND al.답신 = '합격'부분의 쿼리? –

+0

http://www.mysqltutorial.org/mysql-left-join.aspx 정상적인 (내부) 조인과 동일하게 작동합니다. JOIN ON()이 발견되면 더미 NULL의 모든 행이 대신 반환됩니다. 따라서 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;