从表上的多个联接获取数据的有效方法

时间:2013-06-29 23:17:30

标签: mysql sql database

我是编写SQL的新手,并且有一个遗留系统可供我使用,如下所示:

Table A
=========
id | tracker_id | created_on |      status                    | p_id
1  |      1     |     ...    |  (Table C latest new_val ) 4   |  121

Table B
=========
id | a_id | created_on | 
1  | 1    | 2013-12-12 15:15:16
2  | 1    | 2013-12-15 15:20:16
3  | 1    | 2013-12-15 15:25:16
4  | 1    | 2013-12-15 15:30:16
5  | 1    | 2013-12-15 16:20:16
6  | 1    | 2013-12-16 17:20:16
7  | 1    | 2013-12-25 16:25:16


Table C
=========
id | b_id | type | old_val | new_val
1  | 1    | type1|  1      | 2
2  | 2    | type1|  2      | 3
3  | 3    | type1|  3      | 4
4  | 4    | type1|  4      | 5
5  | 5    | type1|  5      | 3
6  | 6    | type1|  3      | 5
7  | 7    | type1|  5      | 3

我希望在2013-12-13和2013-12-17之间的任何特定日期之间获得表A ID的计数,并在该时间范围内使用表C new_val的特定最新值,因此在上述情况下,如果我查询在“2013-12-13和2013-12-17”之间,p_id为121,表C new_val为5,我应该得到1。此外,如果我在“2013-12-13和2013-12-17”之间查询表C new_val为3我应该得到0。

我写了一份表格

的查询
Select count(tableA.id) from tableA tableA 
    inner join tableB tableB on tableA.id=tableB.a_id
    inner join tableC tableCdetails on tableB.id=tableCdetails.b_id
    where tableCdetails.type = 'type1'  and tableCdetails.new_val='5'
    and  tableB.created_on between '2013-12-13' AND '2013-12-17' 
    and tableA.p_id = 121 

我尝试了一些使用试错法的组合,我在某些情况下使用上述查询获得了某些值,但是这与系统中的其他一些值不匹配。我想我错过了这样一个事实:我需要获取时间范围的最新tableB id并匹配对应于该tableB id的tableC条目的new_val,遗憾的是我无法弄清楚如何获取它。有人可以指导我如何在上面的查询中或使用任何其他方法(或者我以完全错误的方式进行查询)完成该操作。

1 个答案:

答案 0 :(得分:0)

您需要获取最新的b值。一种方法是将条件放在from子句中作为附加连接。另一种方法是使用带有相关子查询的where子句:

where tableB.created_on = (select max(created_on)
                           from tableB b2
                           where b2.a_id = tableA.id
                          ) and
       . . . /* the rest of your conditions here */