Как я могу объединить эти три запроса? - PullRequest
1 голос
/ 15 августа 2010

У меня есть три запроса 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))

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

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

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

Ответы [ 2 ]

3 голосов
/ 15 августа 2010

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

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
2 голосов
/ 15 августа 2010
select 
   ( ( select 
        sum(A.a)
    from 
        A join B 
        on A.BID = B.id 
    where 
        B.userID = user.ID ) + 
    ( select 
          sum(C.c)
      from 
          D left join (C) 
          on (D.id = C.DID)
     where D.userID = user.ID ) +
    ( select
          sum(E.e)
      from 
          E 
      where 
          E.userID = user.ID ) )
from
    user
...