这目前正在融化我的大脑,但必须有一种方法可以做到这一点。基本上查询看起来像这样:
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,并且没有任何用户没有的要求。
答案 0 :(得分:1)
如果不进行测试,我认为这样的事情应该有效:
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工作方式不同,但它不应该。