2014-01-27 97 views
-1

對於除了在select語句中使用函數以外的兩個以上的表,我真的對連接感到困惑!在連接中計算列

我有三個表usersdataprojectsdata上的每一行與users表的用戶唯一相關,data表的外鍵爲uid列,其中引用了的users表。

到現在爲止還不難嗎?但我希望。

projects表中每個項目都有上users表太id列兩個分別名爲starterfinisher他們都列引用和彼此不同。

那麼什麼!我想獲取包括其data數量projects,他們開始它(如starter)每個用戶的數據或所有用戶完成了它(爲finisher

select 
    d . *, 
    u . *, 
    COUNT(p.starter) as starter, 
    COUNT(p.finisher) as finisher 
from 
    users u 
     left join 
    projects p ON u.id = p.freelancer 
     left join 
    data d ON u.id = d.uid 
GROUP BY (u.id) 

此查詢結果(如預期)誰已經是starterfinisher或什麼也沒有(projects沒有對應的行)但是計數結果不正確!例如ID爲1用戶完成一個項目,並已開始的人,但結果表明兩個starterfinisher11

回答

2

你加入了錯誤的領域。這種方式總結了starterfinisher拼接前:

select d.*, u.*, 
     coalesce(sum(ps.cnt), 0) as starter, 
     coalesce(SUM(pf.cnt), 0) as finisher 
from users u left join 
    (select p.starter, count(*) as cnt 
     from projects p 
     group by p.starter 
    ) ps 
    on ps.starter = u.id left join 
    (select p.finisher, count(*) as cnt 
     from projects p 
     group by p.finisher 
    ) pf 
    on pf.finisher = u.id left join 
    data d 
    ON u.id = d.uid 
GROUP BY (u.id); 
+0

'#1054 - '字段列表'中的未知列'p.starter' – revo

+0

@revo。 。 。固定。 –

+0

執行,但結果包括起始者和結束者計數的'1'!真正的結果應該是3''starter'和1''finisher' – revo

4

使用子查詢,你可以指望的次數每一個用戶已經starterfinisher

SELECT u.id 
     ,s.countStarter 
     ,f.countFinisher 
FROM users u 
LEFT JOIN (
    SELECT starter, 
      COUNT(*) AS countStarter 
    FROM projects 
    GROUP BY starter 
) s ON u.id = s.starter 
LEFT JOIN (
    SELECT finisher, 
      COUNT(*) AS countFinisher 
    FROM projects 
    GROUP BY finisher 
) f ON u.id = f.finisher 

SQLFiddle

+1

這會在用戶啓動多個項目並完成多個產品時生成笛卡爾產品。 –

+0

和這個結果'3'爲兩個計數!這是錯誤的! – revo

+0

@GordonLinoff我不是在爭辯你,但我不明白你的意思 - 顯然它沒有工作。隨意發佈正確的答案,而不是告訴我如何修復,雖然因爲我g2g 10分鐘! – OGHaza

0

這是你找什麼:

SELECT *, id as userid, 
    (SELECT COUNT(*) FROM 
    projects 
    WHERE projects.starter = userid 
    OR  projects.finisher = userid 
    )AS number 
FROM users 
     LEFT JOIN data 
      ON users.id = data.uid 

我已在數據庫中快速測試這一點,它的工作就像一個魅力:)。希望它有幫助