具有多个LEFT加入问题的Mysql查询

时间:2016-07-19 13:24:41

标签: mysql

我想从mysql查询中获得这种结果:

  

名称|问日期|授予日期|持续时间

     

乔| 2016-07-01 10:02:01 | 2016-07-01 10:02:05 | 10

     

本| 2016-07-01 10:04:24 | 2016-07-01 10:04:26 | 12

     

...

每个条目都存储在一个如下所示的表中:

id | action_date | action_type | unique_instance | name 
12 | 2016-07-01 10:02:01 | Asked | 6546532161654 | Joe
13 | 2016-07-01 10:02:06 | Granted | 6546532161654 | Joe
14 | 2016-07-01 10:05:12 | Asked | 6546532161654 | Ben
15 | 2016-07-01 10:05:15 | Granted | 6546532161654 | Ben
16 | 2016-07-01 10:06:06 | Finished | 6546532161654 | Joe

我尝试过这样的查询,但它没有奏效:

Select table.name as Name, 
table.action_date as Asked, 
g.action_date as Granted, 
TIMESTAMPDIFF(SECOND, g.action_date, q.action_date) as Duration
FROM table 
LEFT JOIN table g ON table.unique_instance = g.unique_instance AND g.action_type = 'Granted' 
LEFT JOIN table q ON table.unique_instance = q.unique_instance AND q.action_type = 'Finished' 
WHERE table.action_type = 'Asked'
AND table.unique_instance = '6546532161654'
GROUP BY table.action_date;

1 个答案:

答案 0 :(得分:0)

如评论中所述。

您的数据库设计似乎不正确,因为您甚至没有使用您的ID。 您无法识别哪条记录是唯一的并且与哪些记录相关,但您仍然可以使用该名称,但它不是唯一的,因为将来您将继续使用相同名称的记录。

我的建议是将action_type和ID作为主键。这样,您始终可以使用相同的ID并相应地更改action_type。

示例(请注意,您不能包含多于1条记录):

  1. ID:1,action_type:Asked
  2. ID:1,action_type:Granted
  3. ID:1,action_type:已完成
  4. 为了调试代码,此查询应该只返回1条记录:

    select * from table where unique_instance = '6546532161654' AND action_type = 'Granted' 
    

    但是因为unique_instance毕竟不是唯一的,所以它会抓住其他不需要的数据。

    注意:您的查询是正确的。