Как я могу объединить эти три запроса?

У меня есть три запроса MySQL, которые мне нужно объединить в один запрос с помощью соединений. У меня много проблем с тем, чтобы понять, как это сделать. Вот три запроса.

select 
    sum(A.a) 
from A join B 
on A.BID = B.id 
where B.userID=userID

select 
    sum(C.c)
from D left join (C) 
on (D.id=C.DID)
 where D.userID = userID

select sum(E.e) from E where E.userID=userID

Мне нужно каким-то образом объединить все эти запросы в один запрос, объединенный с пользовательской таблицей, чтобы дать мне sum(A.a)+sum(C.C)+sum(E.e) для каждого user.id. Я попробовал левое соединение для всех таблиц

user left join (A, B, C, D, E)
on ((A.BID = B.id and B.userID=user.id) 
    or (D.id=C.DID and D.userID = user.id) 
    or (E.userID=user.id))

Это был в значительной степени выстрел в темноте, и он эффектно провалился. Я понятия не имею, как объединить эти три запроса, кто-нибудь подскажет?

Изменить для уточнения: мне нужно, чтобы этот запрос был соединением пользовательской таблицы с указанными выше запросами, потому что мне нужно иметь возможность выбрать все идентификаторы пользователей, упорядоченные по сумме_значения. Три предыдущих запроса выполнялись по отдельности и параметризовались одним идентификатором пользователя.

Дальнейшее редактирование: пробовал все варианты объединения, все присоединенные к пользовательскому запросу, я мог подумать, что это не работает. Он очень близок к работе с некоторыми настройками, но все равно возвращает неверные значения. Я не совсем уверен, почему он это делает.


person Daniel Bingham    schedule 15.08.2010    source источник


Ответы (2)


Может быть, что-то вроде:

select sum(sum_value), user_id from (
select 
    sum(A.a) as sum_value, B.userID as user_id
from A join B 
on A.BID = B.id 
GROUP BY B.userID

UNION ALL

select 
    sum(C.c) as sum_value, D.userID as user_id
from D left join (C) 
on (D.id=C.DID)
GROUP BY D.userID

UNION ALL

select sum(E.e) as sum_value, E.userID as user_id from E
GROUP BY E.userID
)
GROUP BY user_id
person codykrieger    schedule 15.08.2010
comment
Обновлено - сделал это с самого начала (и уже очень поздно, полегче со мной, если это не сработает :), все еще без соединения, но это даст вам сумму по идентификатору пользователя с одним запросом. Вы можете, конечно, добавить ORDER BY в конце, чтобы получить результаты в том порядке, в котором вы хотите. - person codykrieger; 15.08.2010
comment
Не беспокойтесь, спасибо за попытку. Это почти то, что я только что попробовал, и он возвращает неверные значения. Не совсем уверен, почему. Одно из значений имеет userID=37, и для каждого подзапроса показывает соответственно 230, 8 и 50. Но в некоторых показывает как 488. - person Daniel Bingham; 15.08.2010

person    schedule
comment
Бинго! Спасибо @CooL i3oY :) Даже не нужно было присоединяться... лаял совершенно не по тому дереву. - person Daniel Bingham; 15.08.2010
comment
Остается только одно, можно писать без джойна. Я считаю, что это увеличение скорости. - person CooL i3oY; 15.08.2010