目前,这使我的大脑融化,但是必须有一种方法可以做到。基本上查询看起来像这样:
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测试来允许空记录要求,或同时满足记录和用户要求。
最后,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] 删除。
我来说两句