Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 根据假期类型(如考试、无薪、年假)从mysql数据库中获取数据_Php_Mysql_Sql_Database - Fatal编程技术网

Php 根据假期类型(如考试、无薪、年假)从mysql数据库中获取数据

Php 根据假期类型(如考试、无薪、年假)从mysql数据库中获取数据,php,mysql,sql,database,Php,Mysql,Sql,Database,这是我的数据库表 : 这是我想要显示数据的前端: 我需要的是基于休假类型和半天全天的员工休假记录。从左到右依次为员工姓名,然后根据半天=1(db)和休假类型=年度进行年度盘点,依此类推,最后显示总计列和半天年度、考试和无薪乘以0.5 我尝试的是: SELECT users.name, leave_type, count( leaves.id ) FROM leaves INNER JOIN users ON users.id = leaves.employee GROUP

这是我的数据库表

:

这是我想要显示数据的前端:

我需要的是基于休假类型和半天全天的员工休假记录。从左到右依次为员工姓名,然后根据半天=1(db)和休假类型=年度进行年度盘点,依此类推,最后显示总计列和半天年度、考试和无薪乘以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


提前谢谢,请帮忙。

好的,让我们试试这个,看看它是否有效

这就是我提出的模式。它非常简单,但支持您的用例

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;

你得到了什么错误/意外的结果?我需要所有的结果,但我只能通过任何一次年度考试获得所有用户,或者不计算任何其他我不知道的结果;我不知道怎么取。如果您知道您仅限于该模式,请提供帮助?这是可以改变的,还是我们只限于查询?不受限制,你可以向我推荐任何其他查询。这是你试图编写的非常复杂的查询。我认为如果我们把数据分成多个表,会更容易管理。我很快会写下来作为回答。你是天才。谢谢你救了我的命上帝保佑你。再次感谢你。结果并不像你说的那样准确。请检查您的查询,让我知道它显示了更多的resultHi@MuddasirAbbas,因为我需要更多的信息。哪里不准确?Hi@MuddasirAbbas我刚刚添加了第二个查询供您尝试。您提供的第一个查询中,当我添加任何用户休假记录时,每次都会递增,第二个查询仅在一个用户休假记录中显示和更新我添加的内容。请检查两者是否工作正常。
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;