이것은 현재 제 뇌를 녹이고 있지만 그것을 할 방법이 있어야합니다. 기본적으로 쿼리는 다음과 같습니다.
SELECT r.* FROM records r
JOIN users u ON u.job_id = r.job_id
LEFT JOIN records_requirements rr ON rr.record_id = r.id
INNER JOIN user_requirements ur on ur.requirement_id = rr.requirement_id
기본적으로 내가하려는 것은 사용자와 동일한 작업 ID를 가진 모든 레코드를 가져오고 레코드에 요구 사항이있는 경우 사용자가 user_requirements 테이블에 일치하는 레코드가있는 경우에만 선택하는 것입니다. 사용자에게 요구 사항이없는 경우 레코드를 선택하지 마십시오.
따라서 job_id가 같고 요구 사항이 없거나 job_id가 같고 사용자에게 요구 사항이없는 모든 레코드를 가져옵니다.
테스트하지 않고 다음과 같이 작동해야한다고 생각합니다.
SELECT DISTINCT r.*
FROM records r
INNER JOIN users u ON u.job_id = r.job_id
LEFT JOIN records_requirements rr ON rr.record_id = r.id
LEFT JOIN user_requirements ur ON ur.requirement_id = rr.requirement_id
AND ur.user_id = u.id
WHERE
(
(rr.record_id IS NULL)
OR
(rr.record_id IS NOT NULL AND ur.requirement_id IS NOT NULL)
)
AND u.id = ?
그것이하는 일은 요구 사항을 허용하지 않기 위해 요구 사항을 기록하기 위해 조인하는 것입니다. 또한 요구 사항이 있지만 일치하는 사용자 요구 사항이없는 레코드가 여전히 풀링되도록 사용자 요구 사항에 조인하는 것입니다.
그런 다음 where 테스트를 사용하여 null 레코드 요구 사항을 허용하거나 레코드 및 사용자 요구 사항이 모두 적용됩니다.
마지막으로 SELECT DISTINCT를 사용하여 레코드 당 하나의 결과 만 얻도록합니다.
편집 : 다음과 같이 SQL Server를 사용한 빠른 테스트 :
DECLARE @Users TABLE (job_id int)
DECLARE @Records TABLE (id int, job_id int)
DECLARE @Records_Requirements TABLE (requirement_id int, record_id int)
DECLARE @User_Requirements TABLE (requirement_id int)
INSERT INTO @Users VALUES (1)
INSERT INTO @Records VALUES (1, 1)
INSERT INTO @Records VALUES (2, 1)
INSERT INTO @Records VALUES (3, 1)
INSERT INTO @Records_Requirements VALUES (1, 1)
INSERT INTO @Records_Requirements VALUES (2, 2)
INSERT INTO @User_Requirements VALUES (2)
SELECT DISTINCT r.*
FROM @Records r
INNER JOIN @Users u ON u.job_id = r.job_id
LEFT JOIN @Records_Requirements rr ON rr.record_id = r.id
LEFT JOIN @User_Requirements ur on ur.requirement_id = rr.requirement_id
WHERE (rr.record_id IS NULL) OR (rr.record_id IS NOT NULL AND ur.requirement_id IS NOT NULL)
결과 :
id job_id
2 1
3 1
테스트 데이터에 맞다고 생각합니다. 아마도 MySQL은 다르게 작동하지만 그렇지는 않습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다