2013-07-01 5 views
0

Я уже разместил его как different question, и я получил ответ, но сам ответ имеет недостаток.Сложение суммы Из разных таблиц

У меня есть 4 разных таблицы, и каждый из них имеет два общих поля: total_share и idea_user_id.

Я хочу, чтобы получить сумму "SUM из 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.

ответ

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

Смежные вопросы