, 나는 이런 식으로 뭔가 일을해야한다고 생각 :
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 = ?
무엇 더 요구 수 있도록 요구 사항을 기록하기 위해 합류 한 채로하고, 또한 다음 사용자 요구 사항에 합류 남아 그래서 레코드 요구 사항은 있지만 일치하는 사용자 요구 사항은 계속 가져 오지 않습니다.
다음은 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은 다르게 작동하지만 그렇지 않아야합니다.
요구 사항 ID = 레코드 ID가 같은 것 –
반 결합, 'WHERE blah IS NULL'체크가 필요하다고 생각합니다. – Mihai
WHERE (rr.requirement_id IS NULL 또는 ur.requirement_id IS NOT NULL) '? rr.requirement_ids가 여러 개있는 경우이 방법을 사용할 수 있습니까? 레코드 요구 사항이 많은 경우에도 여전히 한 레코드 만 가져 오려고합니다. – PixMach