Mysql
 sql >> Baza danych >  >> RDS >> Mysql

pobrać dane z bazy mysql na podstawie typów urlopów, takich jak egzamin, bezpłatny, roczny

Ok, więc spróbujmy tego i zobaczmy, czy działa.

To jest schemat, z którym mam trochę do czynienia. Jest bardzo prosty, ale obsługuje Twój przypadek użycia.

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

Niektóre dane testowe ...

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

Nie skupiaj się zbytnio na nazwach kolumn i definicjach, w ogóle nie dopracowałem schematu, ponieważ nie wiem wystarczająco dużo o Twojej aplikacji, aby to zrobić.

Po utworzeniu schematu i zawartych w nim danych to dość proste zapytanie powinno zrobić to, co chcesz.

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

Zajrzyj i zobacz, co myślisz. Czy jest to prawdopodobnie aplikacja o wysokiej wydajności lub mocno obciążona?

EDYTUJ

To zapytanie jest bardziej złożone i prawdopodobnie miałoby pewne wady wydajności, ale może być dokładniejsze.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak ustawić parametry zapytania w MySQL Query Browser?

  2. php json_encode mysql wynik

  3. PolyScale.ai — skalowanie MySQL i PostgreSQL z globalnym buforowaniem

  4. problem z utf8 w java

  5. Zapisz pliki CSV w bazie danych mysql