Я полагаю, у вас есть две таблицы, содержащие сущности. Объектами являются employee
и report
.
Эти сущности имеют два разных отношения «многие ко многим»: author
и attendee
.
Итак, ваши столы такие
employee report
-------- -----
employee_id (PK) report_id (PK)
surname title
givenname releasedate
whatever whatever
Тогда у вас есть две многие: много таблиц отношений с одинаковыми столбцами друг с другом. Один - author
, а другой - attendee
.
author / attendee
------
employee_id PK, FK to employee.employee_id
report_id PK, FK to report.report_id
Обратите внимание на составные (две колонки) первичные ключи.
+---------------------+\ /+-------------+\ /+-----------------------+
| +-----+ author +-----+ |
| |/ \+-------------+/ \| |
| employee | | report |
| | | |
| |\ /+-------------+\ /| |
| +-----+ attendee +-----+ |
+---------------------+/ \+-------------+/ \+-----------------------+
\ /
----- means a many-to-many relationship
/ \
Когда вы определяете, что сотрудник является участником определенного отчета, вы вставляете строку в таблицу участников с правильным сотрудником и отчетом.
Если вы хотите, например, всех авторов для каждого отчета, вы можете сделать следующее:
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