2012-02-16 15 views
0

同じタイプの情報(ID、属性、および金額)を含む3つの列を含む2つの表があります。私はそれらを組合で結合し、その組合を、それらをフィルタリングするための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和のために最後に一致した行量回行にマッチする数の属性を取得しています。

(属性が、私もまだ動作するように1つのフィルタリングテーブルをもらっていないtable_b以上のidのフィルタリングを持つ別のテーブルがあります。)

+0

CONCATが大量に減速するので、あなたはあまりアドバイスされていないように、CONCATなしで数値を使用するだけではなく、このようにしているように感じます。例を入力します - table_b idsがどこに参加するかによって大きく異なります –

答えて

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は、必要に応じて変更し、table_ids.b_id上にIDを参加することを想定。

関連する問題