2016-09-20 54 views
0

我有以下两个mysql表。如何关联两个不通过密钥直接连接的mysql表

表名:分析

id execution_time 
--- -------------- 
A1 1 
A2 20 
A3 35 

表名:错误

bug_id creation_time 
------ ------------- 
1000 1.1 
1001 1.3 
1002 20.2 
1003 20.7 
1004 20.9 
1005 35.1 

错误1000,1001用于分析A1

错误1002,1003,1004创建用于分析A2

为分析A3创建了错误1005

因此,Bug creation_time始终大于其Analysis的execution_time,并且bug_creation_time始终小于后面分析的执行次数。

现在,1)我如何找到相关的错误(bug_id),因为我有一个分析ID。

2)我怎么能找到一个给定的错误数据(ID相关的分析ID,CREATION_TIME)

+0

为什么错误1004两次在此表中存在吗?为什么它会分析A3?你的逻辑没有解释自己。 –

+0

对不起,是一个错误。编辑。 –

回答

3

1) SQL FIDDLE DEMO

SELECT b.*, t.* 
FROM Bugs b 
CROSS JOIN ( SELECT a1.id, 
        a1.`execution_time` as `start_time`, 
        a2.`execution_time` as `end_time` 
       FROM Analysis a1 
       LEFT JOIN Analysis a2 
       ON a1.`execution_time` < a2.`execution_time` 
       WHERE a2.`execution_time` IS NULL 
       OR a2.`execution_time` = (SELECT min(z.`execution_time`) 
              FROM Analysis z 
              WHERE z.`execution_time` > a1.`execution_time`) 
      ) t 
WHERE b.`creation_time` between `start_time` and `end_time` 
    or (b.`creation_time` > `start_time` and `end_time` IS NULL) 

OUTPUT:只需要过滤器通过编号

enter image description here

2)

SELECT * 
FROM Analysis a 
WHERE a.id = ( SELECT MAX(id) 
       FROM Analysis a 
       WHERE a.execution_time < @bugCreationTime) 
+0

如果分析的执行时间增加超过1,解决方案1)将不起作用。在那种情况下,1)将如何?非常感谢。 –

+0

是的,我看到你改变了你的问题。在它上面工作。那么2)呢? –

+0

完成,检查演示 –