要求记录存在,如果它们存在于mysql中的另一个表中

时间:2015-02-06 22:16:42

标签: mysql

这目前正在融化我的大脑,但必须有一种方法可以做到这一点。基本上查询看起来像这样:

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,并且没有任何用户没有的要求。

1 个答案:

答案 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工作方式不同,但它不应该。