MySQL返回多行之间的多个差异

时间:2013-05-04 13:20:20

标签: mysql

我有以下问题,我需要根据其他两个表中给出的规范,在一个表中返回值的多个差异。我很确定这可以通过在正确的位置进行一些内连接来实现。我遇到的最大问题是,可能还有两个以上的值需要进行比较,结果应该总是在一行中返回。

应返回的差异是根据表C中的值计算的,表A中给出了应比较的规格。

下面我给出了一个示例,因为它更容易显示情况和示例返回行。我尝试了许多技巧但没有成功,所以非常感谢你的帮助。

数据库使用MySQL。

提前致谢!

表A:

|  identifier  |  type   |   top_id
-------------------------------------
|   aaaa       |   X     |   
|   bbbb       |   Y     |    aaaa
|   cccc       |   Y     |    aaaa
|   dddd       |   Y     |    aaaa

表B:

|  identifier  |  is_base
--------------------------
|   bbbb       |   TRUE
|   cccc       |   FALSE
|   dddd       |   FALSE

表C:

|  identifier  |  type   | sub_type |  value
----------------------------------------------
|   bbbb       |   A     |    Q     |   100
|   cccc       |   A     |    Q     |   90
|   dddd       |   A     |    Q     |   80

结果:

|    top_id    |    base    |   diff1_id |  diff1_value  |  diff2_id  |  diff2_value   
-------------------------------------------------------------------------------------
|    aaaa      |    bbbb    |    cccc    |     10        |   dddd     |     20

1 个答案:

答案 0 :(得分:2)

尝试:

select at.top_id,
       ct.identifier,
       group_concat(concat(cf.identifier,':', ct.value-cf.value)) diffs
from TableA at
join TableB bt on at.identifier = bt.identifier and bt.is_base = 'TRUE'
join TableC ct on bt.identifier = ct.identifier 
join TableA af on at.top_id = af.top_id
join TableB bf on af.identifier = bf.identifier and bf.is_base = 'FALSE'
join TableC cf on bf.identifier = cf.identifier 
group by ct.identifier

SQLFiddle here