沒有測試它,我覺得這樣的事情應該工作:
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測試來允許空記錄要求,或記錄和用戶要求均已到位。
最後,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 – 2015-02-06 22:20:05
我猜你需要一個反連接,一個'WHERE等等是NULL'檢查 – Mihai 2015-02-06 22:24:09
像'WHERE(rr.requirement_id IS NULL或ur.requirement_id IS NOT NULL) '?如果有多個rr.requirement_ids,這會工作嗎?即使它有一堆記錄要求,我仍然只想拉一條記錄。 – PixMach 2015-02-06 22:27:47