我需要获得一个人的证明的有效性。一个人可以拥有2 o个以上的认证。我能够使用max(cert_id)获得证书的最后状态,但这仅显示了一种证书的状态。如何获得每种证书的最大值(CERT_ID)?
+-----------+---------+-------------------+-----------+-------------+----------+
| PERSON_ID | CERT_ID | CERTIFICATION | STATE | EXPIRE_DATE | VALIDITY |
+-----------+---------+-------------------+-----------+-------------+----------+
| 111 | 53961 | CERTIFICATION ONE | DELIVERED | 09-05-2018 | EXPIRED |
+-----------+---------+-------------------+-----------+-------------+----------+
| 111 | 88196 | CERTIFICATION ONE | DELIVERED | 16-03-2020 | VALID |
+-----------+---------+-------------------+-----------+-------------+----------+
| 111 | 96943 | CERTIFICATION TWO | DELIVERED | 04-12-2020 | VALID |
+-----------+---------+-------------------+-----------+-------------+----------+
在这种情况下,我想得到以下结果:
+-----------+---------+-------------------+-----------+-------------+----------+
| PERSON_ID | CERT_ID | CERTIFICATION | STATE | EXPIRE_DATE | VALIDITY |
+-----------+---------+-------------------+-----------+-------------+----------+
| 111 | 88196 | CERTIFICATION ONE | DELIVERED | 16-03-2020 | VALID |
+-----------+---------+-------------------+-----------+-------------+----------+
| 111 | 96943 | CERTIFICATION TWO | DELIVERED | 04-12-2020 | VALID |
+-----------+---------+-------------------+-----------+-------------+----------+
更多信息:有时,每种证书的有效性可能都已到期或有效,具体取决于每种证书的到期日期。
更新:这是我要找的东西的简化。这是我使用的实际查询,但由于我正在使用max_id,因此只显示1个结果。不知道如何通过认证正确分组。
SELECT
PERSON_ID,
WORKER,
job,
MAX(CRED_ID) AS CRED_ID,
CREDENTIAL,
date_1,
date_2,
date_3,
IF(date_2 = 'Not requerided',
IF(STR_TO_DATE(date_1, '%d-%m-%Y') <= STR_TO_DATE(date_3, '%d-%m-%Y'),
date_1,
date_3),
CASE
WHEN
STR_TO_DATE(date_1, '%d-%m-%Y') <= STR_TO_DATE(date_2, '%d-%m-%Y')
AND STR_TO_DATE(date_1, '%d-%m-%Y') <= STR_TO_DATE(date_3, '%d-%m-%Y')
THEN
date_1
WHEN
STR_TO_DATE(date_2, '%d-%m-%Y') <= STR_TO_DATE(date_1, '%d-%m-%Y')
AND STR_TO_DATE(date_2, '%d-%m-%Y') <= STR_TO_DATE(date_3, '%d-%m-%Y')
THEN
date_2
ELSE date_3
END) AS END_DATE,
STATUS
FROM
(SELECT
t.PERSON_ID,
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(CONCAT(t.NAME, ' ', t.LASTNAME), 'Á', 'A'), 'É', 'E'), 'Í', 'I'), 'Ó', 'O'), 'Ú', 'Ú'), 'Ñ', 'N') AS WORKER,
(SELECT
CONCAT(ca.name, ' - ', c.name)
FROM
job c
INNER JOIN job_agrupado ca ON c.agrupado_id = ca.agrupado_id
WHERE
c.job_id = cl.job_id) AS job,
cl.laboral_id AS CRED_ID,
c.cred_id AS CREDENTIAL,
(SELECT
IF(exam.OLD = 1, DATE_FORMAT(exam.EXPIRE_DATE, '%d-%m-%Y'), IF(revalidation.recognized = 0, DATE_FORMAT(DATE_ADD(revalidation.EVALUATION_DATE, INTERVAL revalidation.VALIDITY YEAR), '%d-%m-%Y'), IF(exam.EXPIRE_DATE = ''
OR exam.EXPIRE_DATE IS NULL, DATE_FORMAT(DATE_ADD(exam.EVALUATION_DATE, INTERVAL exam.VALIDITY YEAR), '%d-%m-%Y'), DATE_FORMAT(exam.EXPIRE_DATE, '%d-%m-%Y')))) AS EXPIRATION
FROM
eva_competences revalidation
LEFT JOIN eva_competences exam ON (revalidation.recognized = exam.EVA_LAB_ID)
WHERE
revalidation.TIPO_EVA_ID = 1
AND revalidation.LABORAL_ID = cl.laboral_id
LIMIT 1) AS date_1,
IFNULL((SELECT
IF(exam.OLD = 1, DATE_FORMAT(exam.EXPIRE_DATE, '%d-%m-%Y'), IF(revalidation.recognized = 0, DATE_FORMAT(DATE_ADD(revalidation.EVALUATION_DATE, INTERVAL revalidation.VALIDITY YEAR), '%d-%m-%Y'), IF(exam.EXPIRE_DATE = ''
OR exam.EXPIRE_DATE IS NULL, DATE_FORMAT(DATE_ADD(exam.EVALUATION_DATE, INTERVAL exam.VALIDITY YEAR), '%d-%m-%Y'), DATE_FORMAT(exam.EXPIRE_DATE, '%d-%m-%Y')))) AS EXPIRATION
FROM
eva_competences revalidation
LEFT JOIN eva_competences exam ON (revalidation.recognized = exam.EVA_LAB_ID)
WHERE
revalidation.TIPO_EVA_ID = 2
AND revalidation.LABORAL_ID = cl.laboral_id
LIMIT 1), 'No Requerido') AS date_2,
(SELECT
IF(exam.OLD = 1, DATE_FORMAT(exam.EXPIRE_DATE, '%d-%m-%Y'), IF(revalidation.recognized = 0, DATE_FORMAT(DATE_ADD(revalidation.EVALUATION_DATE, INTERVAL revalidation.VALIDITY YEAR), '%d-%m-%Y'), IF(exam.EXPIRE_DATE = ''
OR exam.EXPIRE_DATE IS NULL, DATE_FORMAT(DATE_ADD(exam.EVALUATION_DATE, INTERVAL exam.VALIDITY YEAR), '%d-%m-%Y'), DATE_FORMAT(exam.EXPIRE_DATE, '%d-%m-%Y')))) AS EXPIRATION
FROM
eva_competences revalidation
LEFT JOIN eva_competences exam ON (revalidation.recognized = exam.EVA_LAB_ID)
WHERE
revalidation.TIPO_EVA_ID = 3
AND revalidation.LABORAL_ID = cl.laboral_id
LIMIT 1) AS date_3,
(SELECT
MIN(IF(exam.OLD = 1, DATE_FORMAT(exam.EXPIRE_DATE, '%d-%m-%Y'), IF(revalidation.recognized = 0, DATE_FORMAT(DATE_ADD(revalidation.EVALUATION_DATE, INTERVAL revalidation.VALIDITY YEAR), '%d-%m-%Y'), IF(exam.EXPIRE_DATE = ''
OR exam.EXPIRE_DATE IS NULL, DATE_FORMAT(DATE_ADD(exam.EVALUATION_DATE, INTERVAL exam.VALIDITY YEAR), '%d-%m-%Y'), DATE_FORMAT(exam.EXPIRE_DATE, '%d-%m-%Y'))))) AS END_DATE
FROM
eva_competences revalidation
LEFT JOIN eva_competences exam ON (revalidation.recognized = exam.EVA_LAB_ID)
WHERE
revalidation.LABORAL_ID = cl.laboral_id) AS END_DATE,
(SELECT
IF(MIN(IF(exam.OLD = 1, DATE_FORMAT(exam.EXPIRE_DATE, '%Y-%m-%d'), IF(revalidation.recognized = 0, DATE_FORMAT(DATE_ADD(revalidation.EVALUATION_DATE, INTERVAL revalidation.VALIDITY YEAR), '%Y-%m-%d'), IF(exam.EXPIRE_DATE = ''
OR exam.EXPIRE_DATE IS NULL, DATE_FORMAT(DATE_ADD(exam.EVALUATION_DATE, INTERVAL exam.VALIDITY YEAR), '%Y-%m-%d'), DATE_FORMAT(exam.EXPIRE_DATE, '%Y-%m-%d'))))) > CURDATE(), 'VALID', 'EXPIRED')
FROM
eva_competences revalidation
LEFT JOIN eva_competences exam ON (revalidation.recognized = exam.EVA_LAB_ID)
WHERE
revalidation.LABORAL_ID = cl.laboral_id) AS STATUS
FROM
competences_laborales cl
LEFT JOIN WORKERS t ON (cl.WORKER_ID = t.WORKER_ID)
LEFT JOIN CREDENTIALS c ON (c.lab_id = cl.laboral_id)
WHERE
t.PERSON_ID = '111'
AND cl.STATUS IN (12 , 13, 7, 8, 9)
ORDER BY PERSON_ID , CRED_ID DESC) AS table2
GROUP BY PERSON_ID;
更新2:内部查询给我以下结果:
+-----------+---------------+---------------------+---------+------------+------------+------------+------------+------------+---------+
| PERSON_ID | WORKER | CERTIFICATION (JOB) | CRED_ID | CREDENTIAL | DATE_1 | DATE_2 | DATE_3 | END_DATE | STATUS |
+-----------+---------------+---------------------+---------+------------+------------+------------+------------+------------+---------+
| 111 | NAME LASTNAME | CERTIFICATION ONE | 53961 | 53961 | 14-02-2017 | 07-02-2017 | 21-02-2017 | 07-02-2017 | EXPIRED |
+-----------+---------------+---------------------+---------+------------+------------+------------+------------+------------+---------+
| 111 | NAME LASTNAME | CERTIFICATION TWO | 88196 | 88196 | 08-02-2020 | 09-02-2021 | 09-02-2021 | 08-02-2020 | VALID |
+-----------+---------------+---------------------+---------+------------+------------+------------+------------+------------+---------+
| 111 | NAME LASTNAME | CERTIFICATION TWO | 96943 | 96943 | 23-03-2020 | 31-03-2019 | 21-02-2020 | 31-03-2019 | VALID |
+-----------+---------------+---------------------+---------+------------+------------+------------+------------+------------+---------+
外部查询仅是为了尝试获取按证书类型分组的最新证书的有效性,并获取3个日期中的最小日期。
答案 0 :(得分:2)
通过将表{{1}分组为JOIN
的最大值为CERT_ID
的派生表,可以达到所需的结果:
CERTIFICATION
输出:
SELECT c1.*
FROM certifications c1
JOIN (SELECT CERTIFICATION, MAX(CERT_ID) AS MAX_CERT_ID
FROM certifications
GROUP BY CERTIFICATION) c2 ON c2.CERTIFICATION = c1.CERTIFICATION AND c2.MAX_CERT_ID = c1.CERT_ID