计算连接中的列

时间:2014-01-27 12:52:25

标签: mysql sql

除了在select语句中使用函数之外,对于两个以上的表,我真的很混淆连接!

我有三张表usersdataprojectsdata上的每一行唯一地与users表的用户相关,而data表的外键是uid列,其引用id users表格。

到现在为止还不难?我希望如此。

projects表中的每个项目都有两个名为starterfinisher的列,它们都在id表的users列上引用,并且与彼此。

那是什么!我想获取每个用户的数据,包括他们data的{​​{1>}和<{1}}的数字(作为projects)或完成它(作为{{1} }})

starter

此查询会导致所有用户(按预期)成为finisherselect 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) 或根本没有(starter上没有相应的行)但是计数结果不正确!例如,标识为finisher的用户已完成一个项目并已启动三个项目,但结果显示projects1 11列!

3 个答案:

答案 0 :(得分: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 :(得分: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);

答案 2 :(得分: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

我已经在我的数据库上快速测试了它,它就像一个魅力:)。希望它有所帮助