Учитывая таблицы mysql, приведенные ниже, как я могу вернуть значение или «status_flag», который дает мне единую сводку состояния всех реквизитов (т. Е. Зеленую, все реквизиты выполнены и текут; желтая, все реквизиты выполнены, но 1 или более устарели; красный отсутствует реквизиты). Все это основано на итоговой таблице позиций, которая связывает все данные вместе.
PERSON table
+----+------+
| id | name |
+----+------+
| 1 | John |
| 2 | Anna |
| 3 | Leon |
+----+------+
ROLE table
+---------+---------------+
| role_id | Role |
+---------+---------------+
| 1 | Manager |
| 2 | Cleaner |
| 3 | Saw operator |
+----+--------------------+
ROLE_REQUISITES table
+---------+---------+---------------+----------+---------+
| requ_id | role_id | type | other_id | quantity|
+---------+---------+---------------+----------+---------+
| 1 | 1 | Form |1 | 1|
| 2 | 1 | Reference |1 | 2|
| 3 | 1 | Training |1 | 1|
| 4 | 2 | Form |1 | 1|
| 5 | 2 | Form |2 | 1|
| 6 | 2 | Reference |1 | 2|
| 7 | 3 | Training |1 | 2|
+---------+---------+---------------+----------+---------+
FORMS_TYPES table
+---------+----------------+
| form_id | name |
+---------+----------------+
| 1 | Application |
| 2 | Next of Kin |
+---------+----------------+
REFERENCES table
+---------+----------------+
| ref_id | name |
+---------+----------------+
| 1 | Written |
| 2 | Verbal |
+---------+----------------+
TRAINING table
+-----------+----------------+
| train_id | name |
+-----------+----------------+
| 1 | First Aid |
| 2 | Saw Operating |
+-----------+----------------+
EXAMPLE JOIN TABLE table
+-----------+----------------+-----------+-------------+
| join_id | person_id | train_id | expiry_date |
+-----------+----------------+-----------+-------------+
| 1 | 1 | 1 | 2019-03-31 |
| 2 | 2 | 1 | 2019-04-08 |
+-----------+----------------+-----------+-------------+
Человек связан с различными формами, ссылками и обучением, используя таблицы соединений, такие как пример, приведенный для обучения (я не показал их все для ясности и краткости). Все объединяемые таблицы имеют срок действия.
А вот таблица окончательных позиций как таковая (обратите внимание, что один человек может играть две разные роли - следовательно, человек может дважды появляться в результатах, требующих двух разных наборов реквизитов - это приемлемо для окончательного решения)
POSITIONS table
+---------------+----------------+-----------+
| position_id | person_id | role_id |
+---------------+----------------+-----------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 3 |
| 4 | 3 | 3 |
+---------------+----------------+-----------+
Итак, вот мой SQL-запрос:
select
person.person_id, person.name
role.role,
/* Here is where I want a single column status returned */
CASE 1
WHEN ( loop_over_all_requisites_checking_good_and_current /* all reqsuites met and current */ )
) THEN 'green'
WHEN ( loop_over_all_requisites_checking_good_and_one_or_more_out_of_date /* all requisites met and one or more expired */)
) THEN 'yellow'
ELSE 'red' /* All other statuses */
END AS role_status,
from `positions`
left join `person` on positions.person_id = person.person_id
left join `role` on positions.role_id = role.role_id
order by person.name
Примеры являются вымышленными, но код требует, чтобы могло потребоваться неопределенное количество каждого реквизита (т. Е. Требуется 5 бланков заявлений и действует только одна ссылка на одну роль, тогда как, возможно, 1 бланк заявки и 4 тренинга для другой роли). Таким образом, реальная проблема заключается в том, что количество требований может варьироваться в зависимости от роли.
Пожалуйста, предоставьте хороший отзыв, если мне нужно уточнить вопрос или данные еще. Это был очень сложный вопрос, чтобы написать