从标准为x mysql的同一表中检索数据

时间:2016-01-22 13:42:41

标签: mysql sql

我有一个表格,其中包含法案栏下的I和R日期,到目前为止,我能够获得duration_total,但我无法获得duration_before_issuing和processing_duration,因为所有确定位于同一个表格上的数据跟踪,所以我有一个挑战发现where t.Act = I and t.Act = R同时给出结果,如上图所示。有什么建议吗?

我的SQL-Transact

SELECT  t.product, r.pro_name, r.d_date, t.Date,  DATEDIFF(t.Date, r.d_date) as duration_total
FROM tracking t, request r 
WHERE t.product = r.product
AND t.Act ='R'

跟踪t

product | Act | Date
---------------------------
a       | I |    date-i
--------------------------
a       | R |    date-r
---------------------------
b       | I |    date-i
---------------------------
b       | R |    date-r

请求r

product  | pro_name | d_date
------------------------------------------
a        | wacha    | date-d
------------------------------------------
b        | wewe     | date-d

结果

pro| pro_name      | duration_before_issuing    |  processing_duration |     duration_total
---------------------------------------------------------------------------------------------------
a  |  wacha  | t.Date(date-i)- r.d_date(date-d) | t.Date(R) - t.Date(I) | t.Date(R)- r.Date(r.d_date)
---------------------------------------------------------------------------------------------------
b  |  wewe   | t.Date(date-i)- r.d_date(date-d) | t.Date(R) - t.Date(I) | t.Date(R)- r.Date(r.d_date)

2 个答案:

答案 0 :(得分:3)

你需要自己加入跟踪表,只选择其中一个的I记录,而只选择另一个的R记录。

SELECT t1.product, t2.date-r.d_date as duration_before_issuing, ... 
FROM tracking t1
INNER JOIN tracking t2 ON t1.product=t2.product
INNER JOIN request r ON t.product = r.product
WHERE t1.act='R' and t2.act='I'

答案 1 :(得分:1)

正如Shadow评论的那样,您需要两次加入跟踪表。类似的东西:

SELECT  r.product, r.pro_name, r.d_date, 
DATEDIFF(t_issue.date, r.d_date) AS duration_before_issuing
DATEDIFF(t_done.date, t_issue.date) AS processing_duration
DATEDIFF(t_done.date, r.d_date) AS duration_total
FROM request r
INNER JOIN tracking t_issue ON r.product = t_issue.product AND t_issue.act='I'
INNER JOIN tracking t_done  ON r.product = t_done.product  AND t_done.act='R'

请注意,我已将request作为查询的驱动表。我认为阅读起来会更清楚,但如果您需要处理尚未完成处理的情况,它也会有所帮助。在这种情况下,您的请求只有1个或0个跟踪日期。上面的查询不会为这些请求返回一行。要解决此问题,请尝试将LEFT JOIN用于tracking的一个或两个联接。或者,您可以使用UNION组合处理不同情况的不同查询。