2014-01-27 45 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 

我已在数据库中快速测试这一点,它的工作就像一个魅力:)。希望它有帮助