0

我已经把它作为一个不同的问题发布了,我得到了答案,但答案本身就有缺陷。

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

我想从所有表中获取“总份额的总和”的总和

这是我的查询

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没有任何元组 where idea_user_id=3,则返回null,但是如果其他表没有条目,则不会返回null

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

4

1 回答 1

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

AUNION会很乐意忽略没有任何结果的表。你可以看到它在这个 SQL Fiddle 上工作:http ://sqlfiddle.com/#!2/4b048/8

于 2013-07-01T07:19:22.077 回答