Mysql进一步使用联合结果上的连接字段进行连接以过滤它们

时间:2012-02-16 20:12:18

标签: mysql

我有两个包含三列的表,其中包含相同类型的信息(id,attributes和amount)。我想将它们组合在一个联合中,并将该联合与另一个包含id列表的表联接起来以过滤它们,然后对常用属性求和。

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的过滤table_b属性,但我还没有找到一个过滤表。)

1 个答案:

答案 0 :(得分: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,根据需要进行更改。