除了在select语句中使用函数之外,对于两个以上的表,我真的很混淆连接!
我有三张表users
,data
和projects
。 data
上的每一行唯一地与users
表的用户相关,而data
表的外键是uid
列,其引用id
users
表格。
到现在为止还不难?我希望如此。
projects
表中的每个项目都有两个名为starter
和finisher
的列,它们都在id
表的users
列上引用,并且与彼此。
那是什么!我想获取每个用户的数据,包括他们data
的{{1>}和<{1}}的数字(作为projects
)或完成它(作为{{1} }})
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)
或根本没有(starter
上没有相应的行)但是计数结果不正确!例如,标识为finisher
的用户已完成一个项目并已启动三个项目,但结果显示projects
和1
1
和1
列!
答案 0 :(得分:4)
使用子查询,您可以计算每个用户为starter
和finisher
的次数。
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
答案 1 :(得分:2)
你正在加入错误的领域。在加入之前,此方法由starter
和finisher
汇总:
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
我已经在我的数据库上快速测试了它,它就像一个魅力:)。希望它有所帮助