2011-11-18 242 views
0

我需要幫助建立查詢。MySQL查詢:GROUP_CONCAT

我有兩個表。一個叫做jobs_certs,另一個叫做users_certs。

jobs_certs表包含申請作業所需的證書。每個必需的證書都有自己的行,其中job_id代表發佈所需證書的作業,而cert_id代表附加到該證書的id。

users_certs表包含用戶擁有的所有證書。每個證書都有自己的行,其中uid表示用戶的id,cert_id表示用戶擁有的證書的id。

我需要查看用戶是否擁有該作業所需的所有證書。所以我嘗試了這樣的事情:

SELECT GROUP_CONCAT(cert_id) as certs, uid 
FROM users_certs 
HAVING certs = (SELECT GROUP_CONCAT(cert_id) FROM jobs_certs WHERE job_id = 6) 

但是我沒有收到任何結果。我應該如何去做這樣的事情?

在此先感謝。

+0

不是用英文描述表格結構,而是以'CREATE'語句的形式使用[示例代碼](http://sscce.org/)。它更清晰。另外,樣本數據(作爲'INSERT'語句)和期望的結果是有幫助的。 – outis

回答

0

給這一去。的cert_id名單上創建作業證書內嵌視圖,另一個用於用戶證書然後inner join在一起(確保存在這樣GROUP_CONCATorder by使GROUP_CONCAT確定性的結果):

select users.uid 
from 
(SELECT GROUP_CONCAT(cert_id order by cert_id asc) as certs, uid 
FROM users_certs 
group by uid) users 
inner join 
(SELECT GROUP_CONCAT(cert_id order by cert_id asc) as certs, job_id 
FROM jobs_certs 
where job_id = 6 
group by job_id) jobs 
on jobs.certs = users.certs; 

或者你甚至可以穿着查詢了一下,返回的所有用戶是否具有所需要的證書或不與hasRequiredCerts柱:

select users.uid,case when job_id is null then 'No' else 'Yes' end as hasRequiredCerts 
from 
(SELECT GROUP_CONCAT(cert_id order by cert_id asc) as certs, uid 
FROM users_certs 
group by uid) users 
left join 
(SELECT GROUP_CONCAT(cert_id order by cert_id asc) as certs, job_id 
FROM jobs_certs 
where job_id = 6 
group by job_id) jobs 
on jobs.certs = users.certs; 
0

一個關係模型的原則之一是列值應是sim而不是複合;在白話中,它被稱爲first normal form(1NF)。雖然GROUP_CONCAT(它產生的關係不是1NF)的有效用途,但它會讓你在這裏絆倒。相反,請關注所需的結果:選擇用戶缺失的工作認證。您可以通過在證書ID上進行左或右連接來完成此操作,並選擇用戶爲NULL的那些行。

SELECT jc.cert_id 
    FROM jobs_certs AS jc 
    LEFT JOIN users_certs AS uc ON jc.cert_id = uc.cert_id 
    WHERE jc.job_id = ? AND uc.cert_id IS NULL 

如果沒有缺少認證,用戶是完全合格的。或者,您可以選擇COUNT(jc.cert_id)以獲取缺失認證的數量。