[英]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 by
在GROUP_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.