該查詢會給你已在蛋白質表中每個蛋白的一個每一項工作的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的連接表來標識特定作業參考的蛋白質。 –
所有蛋白質都與您的「蛋白質」表 –
沒有關係,您是指蛋白質表中的每一個條目? –