Возвращение столбца «status», основанного на многих изменяющихся правилах из подзапроса - PullRequest
0 голосов
/ 07 апреля 2019

Учитывая таблицы 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 тренинга для другой роли). Таким образом, реальная проблема заключается в том, что количество требований может варьироваться в зависимости от роли.

Пожалуйста, предоставьте хороший отзыв, если мне нужно уточнить вопрос или данные еще. Это был очень сложный вопрос, чтобы написать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...