我已将其发布为different question,我得到了答案,但答案本身就存在缺陷。
我有4个不同的表格,每个表格都有两个共同的total_share
和idea_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
它工作正常,但有两个问题:
如果idea_submitter_percentage
没有idea_user_id=3
的任何元组,则它会返回null
,但是如果其他表没有条目,则它不会返回null
。
如果所有表格都没有idea_user_id=3
的任何元组,则返回null
,但它应返回0
。
答案 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