我有两个表“员工”和“证书”。现在我有 4 个证书,我想检查每个员工哪些证书通过了,哪些没有通过。
Select Distinct(certificate.certificatename)
FROM `employeemanagement$certificate` certificate
Where certificatename = '**********'
or certificatename = '************'
or certificatename = '************'
or certificatename = '************'
这会给我我想要的 4 个证书
SELECT employees.employeeid, employees.employeename, certificate.certificatename, certificate.expirationdate, certificate.`status`
FROM `employeemanagement$employees` employees
LEFT JOIN `employeemanagement$certificate_employees` certifcate_employees on employees.id = certifcate_employees.`employeemanagement$employeesid`
LEFT JOIN `employeemanagement$certificate` certificate on certificate.id = certifcate_employees.`employeemanagement$certificateid`
Where employees.currentstatus = 'Active'
这为我提供了所有员工通过的所有证书,但它不会为我提供每个证书的结果
最佳答案
我认为条件聚合是一种合理的方法:
SELECT e.employeeid, e.employeename,
MAX(CASE WHEN c.certificatename = 'C1' THEN c.expirationdate END) as c1_expiration,
MAX(CASE WHEN c.certificatename = 'C1' THEN c.staus END) as c1_status,
MAX(CASE WHEN c.certificatename = 'C2' THEN c.expirationdate END) as c2_expiration,
MAX(CASE WHEN c.certificatename = 'C2' THEN c.staus END) as c2_status,
MAX(CASE WHEN c.certificatename = 'C3' THEN c.expirationdate END) as c3_expiration,
MAX(CASE WHEN c.certificatename = 'C3' THEN c.staus END) as c3_status,
MAX(CASE WHEN c.certificatename = 'C4' THEN c.expirationdate END) as c4_expiration,
MAX(CASE WHEN c.certificatename = 'C4' THEN c.staus END) as c4_status
FROM `employeemanagement$employees` e LEFT JOIN
`employeemanagement$certificate_employees` ce
ON e.id = ce.`employeemanagement$employeesid` LEFT JOIN
`employeemanagement$certificate` c
ON c.id = ce.`employeemanagement$certificateid`
WHERE e.currentstatus = 'Active'
GROUP BY e.employeeid;
您可能会发现使用每个员工一行并在该行上汇总所有证书比使用每个证书使用多个行更容易。
关于MYSQL 检查所有表 1 条目是否有表 2 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58518025/