2013-05-04 39 views
1

我有以下問題,我需要根據其他兩個表中給出的規範在一個表中返回多個值的差異。我非常肯定,這可以通過一些內部連接在正確的位置完成。我遇到的最大問題是一個可能有兩個以上的值需要比較,結果應該總是返回一行。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 

回答

2

Try:

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