2011-11-18 5 views
0

쿼리 작성에 도움이 필요합니다.MySQL 쿼리 : GROUP_CONCAT

두 개의 테이블이 있습니다. 하나는 jobs_certs라고하고 다른 하나는 users_certs라고합니다.

jobs_certs 테이블에는 작업을 신청하는 데 필요한 인증서가 들어 있습니다. 필요한 각 인증서에는 필요한 인증서가 게시 된 작업을 나타내는 job_id와 해당 인증서에 첨부 된 ID를 나타내는 cert_id가있는 자체 행이 있습니다.

users_certs 테이블에는 사용자가 보유한 모든 인증서가 포함되어 있습니다. 각 인증서에는 사용자의 ID를 나타내는 uid와 사용자가 소유 한 인증서의 ID를 나타내는 cert_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

표 구조를 영어로 설명하는 대신 [sample code] (http://sscce.org/)를 CREATE 문 형태로 사용하십시오. 훨씬 더 명확 해. 또한 샘플 데이터 (INSERT 문)와 원하는 결과가 도움이됩니다. – outis

답변

0

이 항목을 사용하십시오.

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; 
: cert_id 목록에 함께 작업 인증서에서 대한 인라인 뷰와 다음 다른 사용자 인증서에서 다른 하나 inner join을 작성합니다 ( GROUP_CONCAT 결정의 결과를 만들기 위해 그 GROUP_CONCATorder by이 있는지 확인)

아니면 필요한 인증서 표시 여부를 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

하나는해야 그 열 값입니다 심 복합물보다는 오히려 ple; 모국어로는 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)을 선택하여 누락 된 인증 수를 확인할 수 있습니다.