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)
我无法弄清楚如何找到一份利用所有蛋白质的工作。
答案 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);