使用:PHP 8
我有三张桌子。前两者有关系,后两者有关系。 我需要所有三个表中的数据,但第二个表中可能无法提供某些信息。另外,当在关系中找到多个匹配项时,我需要将数据与第二个表分开。这对于 sql 来说是可能的吗?或者我应该考虑多个查询并将它们与 PHP 结合起来?
我需要显示所有人员以及相关认证的到期日期。
人
id | 姓名 | DoB | 需要_证书 |
---|---|---|---|
1 | 第 1 个人 | 2000-01-01 | 1 |
2 | 2 人 | 2006-06-06 | 0 |
3 | 第 3 个人 | 1980-01-01 | 1 |
认证
person_id | 认证_id | 过期 |
---|---|---|
1 | 1 | 2025-01-01 |
3 | 2 | 2066-06-06 |
1 | 2 | 2024-03-30 |
认证类型
id | 认证名称 |
---|---|
1 | 认证1 |
2 | 认证2 |
我尝试了很多连接和并集的组合,但我一辈子都无法解决这个问题。
我想要的输出是显示下表:
id | 姓名 | DoB | 认证1 | 认证2 |
---|---|---|---|---|
1 | 第 1 个人 | 2000-01-01 | 2025-01-01 | 2024-03-30 |
2 | 2 人 | 2006-06-06 | n/a | n/a |
3 | 第 3 个人 | 1980-01-01 | n/a | 2066-06-06 |
您可以使用带有多个 LEFT JOIN 子句的 SQL 查询从多个表中检索数据,即使某些信息在某些表中可能不可用。以下是实现这一目标的方法:
SELECT
p.id,
p.Name,
p.DoB,
c1.Expiration AS `Certification 1`,
c2.Expiration AS `Certification 2`
FROM
People p
LEFT JOIN
Certifications c1 ON p.id = c1.person_id AND c1.certification_id = 1
LEFT JOIN
Certifications c2 ON p.id = c2.person_id AND c2.certification_id = 2;
此查询从
People
表中选择数据,然后左连接 Certifications
表两次以检索不同认证的到期日期(Certification 1
和 Certification 2
)。 LEFT JOIN 可确保包含 People 表中的所有记录,即使 Certifications
表中没有匹配的记录也是如此。 :)