Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Abrufen von Daten aus der MySQL-Datenbank auf der Grundlage von Urlaubstypen wie Prüfung, Unbezahlt, Jährlich

Ok, also lass uns das versuchen und sehen, ob es funktioniert.

Dies ist das Schema, mit dem ich etwas zu tun habe. Es ist sehr einfach, unterstützt aber Ihren Anwendungsfall.

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)
);

Einige Testdaten ...

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);

Konzentrieren Sie sich nicht zu sehr auf Spaltennamen und Definitionen, ich habe das Schema überhaupt nicht aufpoliert, da ich nicht genug über Ihre App weiß, um dies zu tun.

Sobald das Schema erstellt und die Daten darin sind, sollte diese ziemlich einfache Abfrage das tun, was Sie wollen.

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

Schauen Sie sich um und sehen Sie, was Sie denken. Handelt es sich wahrscheinlich um eine leistungsstarke oder stark ausgelastete Anwendung?

BEARBEITEN

Diese Abfrage ist komplizierter und hätte wahrscheinlich einige Leistungsnachteile, ist aber möglicherweise genauer.

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;