查询连接3个表

时间:2015-04-07 00:47:56

标签: mysql database subquery

CREATE TABLE User(uid INTEGER AUTO_INCREMENT,address VARCHAR(40),city 
VARCHAR(20),state VARCHAR(20),

到目前为止我尝试过:

SELECT User.uid, Job.jobid, Protein.pid FROM User
JOIN Job ON (Job.uid = User.uid)
JOIN Protein ON (Job.pid = Protein.pid)

我无法弄清楚如何找到一份利用所有蛋白质的工作。

1 个答案:

答案 0 :(得分:0)

此查询将为您提供每个蛋白质表中每种蛋白质之一的作业的job_ids,以及蛋白质表中每种蛋白质中只有一种

select j.job_id
  from job j
    inner join job_proteins p
      on j.job_id = p.jid
  group by j.job_id
    having group_concat(p.pid order by p.pid asc) = 
      (select group_concat(pid order by pid asc) from protein);

演示:http://sqlfiddle.com/#!9/febf6/5

有必要添加一个额外的表来表示作业和蛋白质之间的关系,这是原始模式定义中缺失的

如果一项工作永远不能使用多种相同的蛋白质,那么以下查询也足够了:

select j.job_id, count(j.job_id)
  from job j
    inner join job_proteins p
      on j.job_id = p.jid
  group by j.job_id
    having count(j.job_id) = (select count(pid) from protein);

更新了演示:http://sqlfiddle.com/#!9/febf6/9

请注意,更新的演示会返回两次列出相同蛋白质的样本作业 - 因此要求作业不能使用多于一种相同的蛋白质。

如果一项工作可以多次使用同一种蛋白质,但这没关系,并且您希望将其包含在至少使用一次所有蛋白质的作业结果中,此查询就足够了:

select j.job_id, count(j.job_id)
  from job j
    inner join job_proteins p
      on j.job_id = p.jid
  group by j.job_id
    having count(distinct p.pid) = (select count(pid) from protein);