该查询会给你已在蛋白质表中每个蛋白的一个每一项工作的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
它有必要添加一张额外的表格以表示作业和蛋白质之间的关系,这是您原始模式定义中缺少的关系
如果某个作业确实无法使用多于一个相同的蛋白质,那么t母鸡下面的查询也足够了:
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);
如何是与蛋白质相关的工作。由于作业与具有多对多关系的蛋白质相关,您可能需要创建一个名为job_protein的连接表来标识特定作业参考的蛋白质。 –
所有蛋白质都与您的“蛋白质”表 –
没有关系,您是指蛋白质表中的每一个条目? –