sql >> Database teknologi >  >> RDS >> Mysql

hente data fra mysql database på basis af orlovstyper som Eksamen, Ulønnet, Årlig

Ok, så lad os prøve dette og se om det virker.

Dette er det skema, jeg har noget med. Den er meget enkel, men understøtter din brugssituation.

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

Nogle testdata ...

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

Fokuser ikke for meget på kolonnenavne og definitioner, jeg har slet ikke finpudset skemaet, da jeg ikke ved nok om din app til at gøre dette.

Når først skemaet er lavet og data derinde, skulle denne ret simple forespørgsel gøre, hvad du vil.

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
 

Tag et kig og se hvad du synes. Er dette sandsynligvis en højtydende eller tungt belastet applikation?

REDIGER

Denne forespørgsel er mere involveret og ville sandsynligvis have nogle ydeevne ulemper, men kan være mere præcis.

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;


  1. Er der nogen mulighed for at lytte på et sql bord/felt med kamel?

  2. kodetænder dynamisk routing

  3. Room API - Hvordan henter jeg det nyligt indsatte genererede id for enheden?

  4. MySQL:kan ikke få adgang til root-kontoen