Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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
如何在MySQL中使用两个表编写计算查询?_Mysql - Fatal编程技术网

如何在MySQL中使用两个表编写计算查询?

如何在MySQL中使用两个表编写计算查询?,mysql,Mysql,我有两个TBL如下 请求待决条件 id | request | created 1 | asdf | 2013-07-04 14:39:03 2 | qwer | 2013-07-10 12:06:37 历史tbl id | request_id | status | date 1 | 1 | Pending | 2013-07-04 14:39:03 2 | 1 | Reviewing | 2013-07-0

我有两个TBL如下

请求待决条件

id | request | created
1  | asdf    | 2013-07-04 14:39:03
2  | qwer    | 2013-07-10 12:06:37
历史tbl

id | request_id | status       | date
1  |     1      | Pending      | 2013-07-04 14:39:03
2  |     1      | Reviewing    | 2013-07-05 01:10:14
3  |     1      | Implementing | 2013-07-06 11:25:54
4  |     1      | Completed    | 2013-07-07 12:36:32
5  |     2      | Pending      | 2013-07-10 15:05:56
6  |     2      | Reviewing    | 2013-07-11 03:08:04
7  |     2      | Implementing | 2013-07-13 11:45:48
8  |     2      | Completed    | 2013-07-17 14:28:15
我想显示以上2个TBL,如下所示

Request | Reviewing Time | Implementing Time 
asdf    |      0         |      0            
qwer    |      1         |      2
带有request_id=1示例的理论如下

审查到实施=(2013-08-06)-(2013-08-05)=1天

待审查=(2013-08-05)-(2013-08-04)=1天

审核时间=(审核至实施)-(待审核) =0天

审查到实施=(2013-08-06)-(2013-08-05)=1天

实施到完成=(2013-08-07)-(2013-08-06)=1天

实施时间=(实施至完成)-(回顾至 执行)=0


这里有一个很长的解决方法

 CREATE TABLE my_table 
 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
 ,request_id INT NOT NULL
 ,status       VARCHAR(20) NOT NULL
 ,date DATETIME NOT NULL
 ,UNIQUE(request_id,status)
 );

 INSERT INTO my_table VALUES
 (1  ,1      ,'Pending','2013-07-04 14:39:03'),
 (2  ,     1      ,'Reviewing','2013-07-05 01:10:14'),
 (3  ,     1      ,'Implementing','2013-07-06 11:25:54'),
 (4  ,     1     ,'Completed','2013-07-07 12:36:32'),
 (5  ,     2     ,'Pending','2013-07-10 15:05:56'),
 (6  ,     2     ,'Reviewing','2013-07-11 03:08:04'),
 (7  ,     2     ,'Implementing','2013-07-13 11:45:48'),
 (8  ,     2     ,'Completed','2013-07-17 14:28:15');

 SELECT request_id
      , DATEDIFF(implementing,reviewing) - DATEDIFF(reviewing,pending) rT
      , DATEDIFF(completed,implementing) - DATEDIFF(implementing,reviewing) iT
 FROM (
 SELECT x.request_id
      , MAX(CASE WHEN status = 'pending' THEN date END) pending 
      , MAX(CASE WHEN status = 'reviewing' THEN date END) reviewing
      , MAX(CASE WHEN status = 'implementing' THEN date END) implementing
      , MAX(CASE WHEN status = 'completed' THEN date END) completed
   FROM my_table x
  GROUP 
     BY request_id
     ) a;

 +------------+------+------+
 | request_id | rT   | iT   |
 +------------+------+------+
 |          1 |    0 |    0 |
 |          2 |    1 |    2 |
 +------------+------+------+

sqlfiddle of same:

不确定我是否正确理解了您的需求,但下面是我从您的问题中读出的示例。在这个示例中,我使用嵌套查询来获取每个请求的计算结果。DATEDIFF以天为单位提供两个日期的差异。我使用ABS是因为我假设你们不想要负数,我不确定那个些日期是否总是给出正数。示例中给出的是不带abs的allso

SELECT calc.request, ABS(calc.`reviewing to implementing`-calc.`pending to reviewing`) AS 'Reviewing Time', ABS(calc.`implementing to completed`-calc.`reviewing to implementing`) AS 'Implementing Time'
    FROM (
        SELECT t1.request,
        (
            SELECT ABS(DATEDIFF((SELECT `date` FROM history_tbl WHERE request_id = t1.id AND `status` = 'Reviewing'), (SELECT `date` FROM history_tbl WHERE request_id = t1.id AND `status` = 'Implementing')))
        ) AS 'reviewing to implementing',
        (
            SELECT ABS(DATEDIFF((SELECT `date` FROM history_tbl WHERE request_id = t1.id AND `status` = 'Pending'), (SELECT `date` FROM history_tbl WHERE request_id = t1.id AND `status` = 'Reviewing')))
        ) AS 'pending to reviewing',
        (
            SELECT ABS(DATEDIFF((SELECT `date` FROM history_tbl WHERE request_id = t1.id AND `status` = 'Implementing'), (SELECT `date` FROM history_tbl WHERE request_id = t1.id AND `status` = 'Completed')))
        ) AS 'implementing to completed'
        FROM request_tbl as t1
    ) AS calc