繁体   English   中英

MySQL查询:GROUP_CONCAT

[英]MySQL Query: GROUP_CONCAT

我需要建立查询的帮助。

我有两张桌子。 他的一个叫jobs_certs,另一个叫users_certs。

job_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)

但是我没有得到任何结果。 我该怎么办呢?

提前致谢。

快去 创建作业证书内嵌视图,另一个用于用户证书然后inner join在一起,他们的名单上cert_id (确保有一个order byGROUP_CONCAT做出的结果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一下查询,以使用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;

关系模型的宗旨之一是,列值应该简单而不是复合。 在白话语中,它被称为第一范式 (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)以获取缺少的证书数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM