2017-08-31 94 views
0

我有以下查詢LEFT JOIN麻煩多個表

SELECT a.account_id, sum(p.amount) AS amount 
FROM accounts a 
LEFT JOIN users_accounts ua 
    JOIN users u 
     JOIN payments p on p.meta_id = u.user_id 
    ON u.user_id = ua.user_id 
ON ua.account_id = a.account_id 
WHERE p.date_prcsd BETWEEN '2017-08-01 00:00:00' AND '2017-08-31 23:59:59' 
GROUP BY a.account_id 
ORDER BY account_id ASC; 

我希望所有從accounts a行和零丟失的數據量是。爲不同類型的連接和不同的連接結構設置相同的結果集 - 只有在p中有一些付款的行。

我該在哪裏出錯?

回答

1

簡體:

SELECT a.account_id 
,sum(coalesce(p2.amount, 0)) AS amount 
FROM accounts a 
LEFT JOIN users_accounts ua ON (a.account_id = ua.account_id) 
LEFT JOIN users u ON (ua.user_id = u.user_id) 
LEFT JOIN (
    SELECT p.meta_id 
    ,p.amount 
    FROM payments p 
    WHERE p.date BETWEEN '2017-08-01' AND '2017-08-10' 
) AS p2 ON (u.user_id = p2.meta_id) 
GROUP BY a.account_id 
ORDER BY account_id ASC; 

結果:

account_id | amount 
------------+-------- 
      1 |  4 
      2 |  0 
      3 |  0 
(3 rows) 

說明:您需要採取所有返回空值的照顧。 coalesce()爲你做。 where子句實際上是您的解決方案中的真正問題,因爲它會過濾掉您希望在endresult中存在的行。最重要的是:你遺漏了其他表的左連接。我創建了一個簡化的測試數據庫:

$ cat tables.sql 
drop table users_accounts; 
drop table payments; 
drop table users; 
drop table accounts; 

create table accounts (account_id serial primary key, name varchar not 
null); 
create table users (user_id serial primary key, name varchar not null); 
create table users_accounts(user_id int references users(user_id), 
          account_id int references 
          accounts(account_id)); 
create table payments(meta_id int references users(user_id), amount int 
not null, date date); 

insert into accounts (account_id, name) values (1, 'Account A'), (2, 
'Account B'), (3, 'Account C'); 
insert into users (user_id, name) values (1, 'Marc'), (2, 'Ruben'), (3, 
'Isaak'); 
insert into users_accounts (user_id, account_id) values (1,1),(2,1); 
insert into payments(meta_id, amount, date) values (1,1, '2017-08-01'), 
(1,2, '2017-08-11'),(1,3, '2017-08-03'),(2,1, null),(2,2, null),(2,3, 
null); 
+0

這個查詢確實有效,但是隻要我應用WHERE子句,它就會在給定期間內返回幾條記錄在'payments'中的行。在發佈問題之前,我已經嘗試過'COALESCE' – mariobgr

+0

答案已被編輯。 –

+0

現在我們在說':) Mucho謝謝,像魅力一樣工作! – mariobgr