从不同的表中添加Sum

时间:2013-07-01 06:52:53

标签: mysql

我已将其发布为different question,我得到了答案,但答案本身就存在缺陷。

我有4个不同的表格,每个表格都有两个共同的total_shareidea_user_id字段。

我想从所有表中获得“total_share的总和”的总和

这是我的查询

SELECT SUM
        (
            ifnull(s.total_share, 0) + 
            ifnull(r.total_share, 0) + 
            ifnull(c.total_share, 0) +  
            ifnull(p.total_share, 0)
        ) as total_sum
FROM idea_submitter_percentage s
left outer join idea_revisor_percentage r on r.idea_user_id = s.idea_user_id
left outer join idea_contributor_percentage c on c.idea_user_id = s.idea_user_id
left outer join idea_comparisor_percentage p on p.idea_user_id = s.idea_user_id
WHERE s.idea_user_id = 3

它工作正常,但有两个问题:

  1. 如果idea_submitter_percentage没有idea_user_id=3的任何元组,则它会返回null,但是如果其他表没有条目,则它不会返回null

  2. 如果所有表格都没有idea_user_id=3的任何元组,则返回null,但它应返回0

1 个答案:

答案 0 :(得分:0)

问题在于,在执行JOIN时,您希望一个“主”表至少有一个结果。在您的情况下,这是不能保证的。解决问题的方法是使用UNION语句:

SELECT idea_user_id, SUM(total_share) AS total_share
FROM (

    SELECT s.idea_user_id, s.total_share
    FROM idea_submitter_percentage s
    WHERE s.idea_user_id = 3

    UNION ALL

    SELECT r.idea_user_id, r.total_share
    FROM idea_revisor_percentage r
    WHERE r.idea_user_id = 3

    UNION ALL

    SELECT c.idea_user_id, c.total_share
    FROM idea_contributor_percentage c
    WHERE c.idea_user_id = 3

    UNION ALL

    SELECT p.idea_user_id, p.total_share
    FROM idea_comparisor_percentage p
    WHERE p.idea_user_id = 3
) a

UNION会很乐意忽略没有任何结果的表格。你可以看到它适用于这个SQL小提琴:http://sqlfiddle.com/#!2/4b048/8