2013-04-26 73 views
3

我有一个job表和visit表。一项工作可以有多次访问。我需要检索所有尚未设置为付费的作业,并将与该作业相关的所有访问都设置为已完成。检索所有相关数据符合指定标准的行

所以基本上我只需要检索工作,如果:

  • 它尚未支付绑到工作(paid = 'N')
  • 所有的访问都明显设置为完整(status = 2)

执行以下操作不起作用,因为它将返回任何结果,其中job.paid = 'N' and visit.status = '2'

SELECT * 
FROM job INNER JOIN visit 
     ON job.id = visit.job_id 
WHERE job.paid = 'N' AND 
     visit.status = 2; 

我可以检索结果,并运行其他查询来检查所有工作的访问是否完成,但我想知道是否可以在单个查询中检索数据?

回答

1

更新1

SELECT a.ID -- <<== add some columns here 
FROM job a INNER JOIN visit b ON a.id = b.job_ID 
WHERE a.paid = 'N' 
GROUP BY a.ID 
HAVING COUNT(DISTINCT b.Status) = 1 AND MAX(b.status) = 2 
+1

尽管您在付费栏中显示错误 - 除非OP在他的帖子中犯了错误。他显示付费列在JOB表中,而不是VISITS表。 – Jim 2013-04-26 15:17:31

1
SELECT * 
FROM job j 
WHERE j.paid = 'N' AND 
    NOT EXISTS (SELECT 1 FROM visit WHERE job_id = j.id AND visit.status <> 2); 
1
SELECT * FROM job WHERE paid = 'N' AND id NOT IN (
SELECT job_id FROM visit WHERE status != 2) 
1

如果您有没有任何相关的访问记录的工作的可能性,你会希望仍然返回工作记录如果已付='N',那么你会想要加入。

SELECT * 
FROM JOB j 
LEFT JOIN VISIT v 
ON j.id = v.job_id 
WHERE j.paid = 'N' 
AND j.id NOT IN (SELECT job_id FROM visit WHERE status != 2) 
相关问题