2012-01-31 103 views
10

我有三个表,我想从一个表中选择所有数据,并且还要收集特定数据行链接次数的COUNT另外两张桌子。SQL在两个表中的多个COUNT(),在一个LEFT JOIN中

因此,从site_projects中选择所有数据。然后返回一个COUNT的site_project_members WHERE site_projectsid = site_project_memberspid,并返回COUNT个site_project_tasks,其中site_projectsid = site_project_memberspid

我希望我是有道理的,对于查询,它看起来是正确的。并且它没有问题地查询数据库(MySQL)。 以外,它返回两个计数的总和。 (请参阅下表结构)

site_projects

id | title  | desc  | start  | deadline | progress 

1 | Project 1 | a project | 1321748906 | 1329847200 | 20 

site_project_members

id | pid | uid | img | hidden 
1 | 1 | 1 | 1 | 0 
2 | 1 | 2 | 2 | 0 

site_project_tasks

id | pid | desc | completed 
1 | 1 | Task 1 | 1 
1 | 1 | Task 2 | 0 

这里是我的查询:

SELECT p.`id`, p.`title`, p.`desc`, p.`progress`, p.`start`, p.`deadline`, COUNT(m.`id`) as `members`, COUNT(t.`id`) as `tasks` FROM `site_projects` p LEFT JOIN `site_project_members` m ON p.`id`=m.`pid` LEFT OUTER JOIN `site_project_tasks` t ON p.`id`=t.`pid` ORDER BY p.`id` ASC 

结果我得到的是:

id | title  | desc  | progress | start  | deadline | members | tasks 
1 | Project 1 | a project | 20  | 1321748906 | 1329847200 | 4  | 4 

无论是“4”的值应该为2。然而,它们不是:能小号任何帮助? 大加赞赏

感谢, 丹

+0

这是因为您在汇总错误!与其他RDBMS不同,MySQL不会阻止你像这样运行聚合。基本上你会得到随机值,因为你没有指定一个“GROUP BY”。 – JNK 2012-01-31 18:52:16

回答

21
SELECT p.id , p.title , p.desc , p.progress , p.start , p.deadline , 
    COALESCE(m.cnt, 0) AS members, 
    COALESCE(t.cnt, 0) AS tasks 
FROM site_projects p 
LEFT JOIN 
    (SELECT pid, COUNT(*) AS cnt FROM 
    site_project_members 
    GROUP BY pid) m 
ON p.id = m.pid 
LEFT JOIN 
    (SELECT pid, COUNT(*) AS cnt FROM 
    site_project_tasks 
    GROUP BY pid) t 
ON p.id = t.pid 
ORDER BY p.id ASC 
+0

工程! :D非常感谢你:) – 2012-01-31 19:07:17

+0

非常感谢,这让我省下了我的查询。 SELECT COALESCE(posts.total,0)AS posts,COALESCE(likes.total,0)AS likes,COALESCE(comments.total,0)AS评论,'user'。*,'company'.name FROM'user' INNER JOIN'company' ON user.company_id = company.id INNER JOIN(SELECT user_id,count(*)AS FROM'feed' GROUP BY user_id)posts ON_user_id = user.id INNER JOIN(SELECT user_id ,count(*)AS FROM'comment' GROUP BY user_id)评论ON comments.user_id = user.id INNER JOIN(SELECT user_id,count(*)AS FROM'like' GROUP BY user_id)likes ON likes.user_id = user.id; – 2014-09-24 04:26:14

3
SELECT p.`id`, p.`title`, p.`desc`, p.`progress`, p.`start`, p.`deadline`, 
    (SELECT COUNT(*) FROM site_project_members m WHERE p.`id`=m.`pid`) AS `members`, 
    (SELECT COUNT(*) FROM site_project_tasks t WHERE p.`id`=t.`pid`) AS `tasks` 
FROM `site_projects` p 
ORDER BY p.`id` ASC 

这确实应该做的伎俩。

+0

感谢您的回答,但它仍然给出了相同的结果:S – 2012-01-31 18:55:16

+0

嗯,问题在于外部连接...让我想想如何重新设计它。 – dgw 2012-01-31 19:00:05

+0

@DanSpiteri好的,重新设计完成。 – dgw 2012-01-31 19:07:34