2012-02-16 45 views
0

我有两个包含三列的表包含相同类型的信息(id,属性和金额)。我想将它们合并到一个联合中,并将该联合与另一个包含id列表的表进行过滤,然后对常用属性进行求和。Mysql进一步联合在联合结果上使用连接字段来筛选它们

table_a      table_b     table_ids 
id attr amount   id attr  amount  uid  a_id 
1 'atr1' 10    1 'atr2' 4   'id1' 1 
1 'atr2' 5    2 'atr3' 2   'id2' 2 
2 'atr3' 7    2 'atr1' 11 
3 'atr1' 8 

我试图

SELECT table_ids.uid, t.attr, SUM(t.amount) 
FROM table_ids 
JOIN (SELECT CONCAT('a', id) AS comb_id, attr, amount FROM table_a 
    UNION ALL 
    SELECT CONCAT('b', id) AS comb_id, attr, amount FROM table_b 
    ) t 
ON CONCAT('a', table_ids.a_id) = t.comb_id 
GROUP BY t.attr 

,但我只得到了最后一个匹配A_ID属性和匹配行时间总和的最后一个匹配的行量的数量。

(将会有更多的ID过滤另一个表表-B的属性,但我还没有得到一个过滤表上班呢。)

+0

感觉好像你在以不恰当的方式做这件事,为什么不使用没有CONCAT的数字,因为CONCAT会大大减缓这种情况。将键入一个例子 - 很大程度上取决于table_b id将加入的位置,尽管tbh – 2012-02-16 20:22:50

回答

1

很难100%肯定,你的目标是什么,但这样的事情可能适合账单

SELECT 
    joinedData.uid, 
    joinedData.attr, 
    SUM(joinedData.amount) AS amount 
FROM (
    (
     SELECT 
      table_ids.uid, 
      table_a.attr, 
      SUM(table_a.amount) AS amount 
     FROM table_a 
     INNER JOIN table_ids 
     ON table_ids.a_id = table_a.id 
     GROUP BY table_ids.uid, table_a.attr 
    ) 
    UNION 
    (
     SELECT 
      table_ids.uid, 
      table_b.attr, 
      SUM(table_b.amount) AS amount 
     FROM table_b 
     INNER JOIN table_ids 
     ON table_ids.b_id = table_b.id 
     GROUP BY table_ids.uid, table_b.attr 
    ) 
) AS joinedData 
GROUP BY joinedData.uid, joinedData.attr 

当然假定table_b将id加入到table_ids.b_id中,根据需要进行更改。