извлекать данные из базы данных mysql на основе типов отпуска, таких как Exam, Unpaid, Annual

Это моя таблица базы данных

: введите описание изображения здесь

Это мой передний конец, где я хочу отображать данные:

введите описание изображения здесь

Мне нужно, чтобы сотрудник оставил запись по основным типам отпуска и полдня на полный день. слева направо имя сотрудника, затем годовой подсчет на основе половины дня = 1 в дБ и тип отпуска = годовой и т. д., а в последнем показывают некоторые из всех столбцов в общей колонке и полугодии, экзамен и неоплачиваемый умножитель с 0,5.

То, что я пробовал:

SELECT users.name, leave_type, count( leaves.id ) FROM leaves INNER JOIN users ON users.id = leaves.employee GROUP BY leaves.leave_type, users.name 

 SELECT leaves.*, count( users.id ) FROM leaves LEFT JOIN users ON users.id=leaves.employee GROUP BY users.name 

Заранее спасибо, пожалуйста, помогите.

Итак, давайте попробуем это и посмотрим, работает ли оно.

Это схема, с которой я связан. Это очень просто, но поддерживает ваш прецедент.

 CREATE TABLE employees ( id int unsigned auto_increment, name varchar(255), PRIMARY KEY(id) ); CREATE TABLE leave_type ( id int unsigned auto_increment, name varchar(255), PRIMARY KEY(id) ); CREATE TABLE leave_log ( id int unsigned auto_increment, leave_type_id int unsigned, employee_id int unsigned, is_full_day int unsigned, is_half_day int unsigned, PRIMARY KEY(id) ); 

Некоторые тестовые данные …

 INSERT INTO employees VALUES (14, 'Lisa'), (15, 'Homer'), (13, 'Bart'); INSERT INTO leave_type VALUES (1, 'Annual'), (2, 'Unpaid'), (3, 'Exam'); INSERT INTO leave_log VALUES (NULL, 3, 14, 1, 0), (NULL, 1, 14, 1, 0), (NULL, 1, 14, 0, 1), (NULL, 1, 14, 0, 1); INSERT INTO leave_log VALUES (NULL, 2, 15, 0, 1); INSERT INTO leave_log VALUES (NULL, 3, 13, 1, 0), (NULL, 1, 13, 1, 0); 

Не сосредотачивайтесь слишком много на именах столбцов и определениях, я вообще не отполировал схему, поскольку я не знаю достаточно о вашем приложении, чтобы это сделать.

После создания схемы и данных там этот довольно простой запрос должен делать то, что вы хотите.

 SELECT e.name, SUM(annual.is_half_day), SUM(unpaid.is_half_day), SUM(exam.is_half_day), SUM(annual.is_full_day), SUM(unpaid.is_full_day), SUM(exam.is_full_day) FROM employees e LEFT JOIN leave_log annual ON annual.leave_type_id = 1 AND annual.employee_id = e.id LEFT JOIN leave_log unpaid ON unpaid.leave_type_id = 2 AND unpaid.employee_id = e.id LEFT JOIN leave_log exam ON exam.leave_type_id = 3 AND exam.employee_id = e.id GROUP BY e.id 

Посмотрите и посмотрите, что вы думаете. Возможно, это будет высокопроизводительное или сильно загруженное приложение?

РЕДАКТИРОВАТЬ

Этот запрос более активен и, вероятно, будет иметь некоторые недостатки в производительности, но может быть более точным.

 SELECT e.name, e.id, IFNULL(annual_half.total, 0) annual_half, IFNULL(unpaid_half.total, 0) unpaid_half, IFNULL(exam_half.total, 0) exam_half, IFNULL(annual_full.total, 0) annual_full, IFNULL(unpaid_full.total, 0) unpaid_full, IFNULL(exam_full.total, 0) exam_full FROM employees e LEFT JOIN ( SELECT SUM(is_full_day) as total, employee_id, leave_type_id FROM leave_log WHERE is_full_day = 1 AND leave_type_id = 1 GROUP BY 3, 2) annual_full ON annual_full.employee_id = e.id LEFT JOIN ( SELECT SUM(is_full_day) as total, employee_id, leave_type_id FROM leave_log WHERE is_full_day = 1 AND leave_type_id = 2 GROUP BY 3, 2) unpaid_full ON unpaid_full.employee_id = e.id LEFT JOIN ( SELECT SUM(is_full_day) as total, employee_id, leave_type_id FROM leave_log WHERE is_full_day = 1 AND leave_type_id = 3 GROUP BY 3, 2) exam_full ON exam_full.employee_id = e.id LEFT JOIN ( SELECT SUM(is_half_day) as total, employee_id, leave_type_id FROM leave_log WHERE is_half_day = 1 AND leave_type_id = 1 GROUP BY 3, 2) annual_half ON annual_half.employee_id = e.id LEFT JOIN ( SELECT SUM(is_half_day) as total, employee_id, leave_type_id FROM leave_log WHERE is_half_day = 1 AND leave_type_id = 2 GROUP BY 3, 2) unpaid_half ON unpaid_half.employee_id = e.id LEFT JOIN ( SELECT SUM(is_half_day) as total, employee_id, leave_type_id FROM leave_log WHERE is_half_day = 1 AND leave_type_id = 3 GROUP BY 3, 2) exam_half ON exam_half.employee_id = e.id GROUP BY 1;