SELECT r.title, r.releasedate,
GROUP_CONCAT(e.surname ORDER BY e.surname SEPARATED BY ',')surnames
FROM report r
LEFT JOIN author a ON r.report_id = a.report_id
LEFT JOIN employee e ON a.report_id = e.report_id
GROUP BY r.title, r.releasedate
ORDER BY r.releasedate DESC
这个 LEFT JOIN 操作允许您的查询查找没有作者的报表。普通内胎 JOIN 操作将从结果集中抑制这些行。 这种严格的e:r设计有一个局限性。对于许多类型的报告(例如科学论文),作者的顺序至关重要(你想开始一场学术性的食物大战吗?按错误的顺序列出论文的作者。) 所以您可以创建一个表,其中可能还包含一个序数值。
author
------
employee_id PK, FK to employee.employee_id
report_id PK, FK to report.report_id
ordinal INT
您的报表查询将包含这一行。
GROUP_CONCAT(e.surname ORDER BY e.ordinal SEPARATED BY ',')surnames
1条答案
按热度按时间nbysray51#
我相信,您有两个包含实体的表。实体是
employee
以及report
.这些实体具有两种不同的多对多关系:
author
以及attendee
.你的table是这些
那你有两个many:many relationship 彼此具有相同列的表。一个是
author
另一个是attendee
.请注意复合(两列)主键。
当您确定某个员工是某个报表的与会者时,可以在“与会者”表中插入一行,其中包含正确的员工和报表。
例如,如果希望每个报表的所有作者都可以这样做:
这个
LEFT JOIN
操作允许您的查询查找没有作者的报表。普通内胎JOIN
操作将从结果集中抑制这些行。这种严格的e:r设计有一个局限性。对于许多类型的报告(例如科学论文),作者的顺序至关重要(你想开始一场学术性的食物大战吗?按错误的顺序列出论文的作者。)
所以您可以创建一个表,其中可能还包含一个序数值。
您的报表查询将包含这一行。