2015-04-07 48 views
0
CREATE TABLE User(uid INTEGER AUTO_INCREMENT,address VARCHAR(40),city 
VARCHAR(20),state VARCHAR(20), 

我試過到目前爲止:查詢連接3臺

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

我無法弄清楚如何找到利用所有蛋白質的工作。

+0

如何是與蛋白質相關的工作。由於作業與具有多對多關係的蛋白質相關,您可能需要創建一個名爲job_protein的連接表來標識特定作業參考的蛋白質。 –

+0

所有蛋白質都與您的「蛋白質」表 –

+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

它有必要添加一張額外的表格以表示作業和蛋白質之間的關係,這是您原始模式定義中缺少的關係

如果某個作業確實無法使用多於一個相同的蛋白質,那麼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); 
+0

什麼是group_concat? –

+0

這是一個將一組結果連接成一個字符串的mysql函數。 https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat。例如在子查詢中,而不是爲每個pid返回一行,它只返回一個類似於「1,2,3,... N」的字符串,其中N是表中的最後一個pid –

+0

所以這個查詢會獲得利用每一種蛋白質的工作? –