我有三个表,我想从其中一个表中选择所有数据,并且还收集在其他两个表中链接特定行数据的次数的COUNT.
因此,从site_projects中选择所有数据.然后返回一个COUNT的site_project_members WHERE site_projects.id= site_project_members.pid并返回一个COUNT的site_project_tasks WHERE site_projects.id= site_project_members.pid
我希望我有意义,对于查询,它看起来是正确的.并且它没有问题地查询数据库(MySQL).除了它返回两个计数的总和作为两件事.(见下表结构)
site_projects
id | title | desc | start | deadline | progress
1 | Project 1 | a project | 1321748906 | 1329847200 | 20
Run Code Online (Sandbox Code Playgroud)
site_project_members
id | pid | uid | img | hidden
1 | 1 | 1 | 1 | 0
2 | 1 | 2 | 2 | 0
Run Code Online (Sandbox Code Playgroud)
site_project_tasks
id | pid | desc | completed
1 | 1 | Task 1 | 1
1 | 1 | Task 2 | 0
Run Code Online (Sandbox Code Playgroud)
这是我的查询:
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
Run Code Online (Sandbox Code Playgroud)
我得到的结果是:
id | title | desc | progress | start | deadline | members | tasks
1 | Project 1 | a project | 20 | 1321748906 | 1329847200 | 4 | 4
Run Code Online (Sandbox Code Playgroud)
两个"4"值都应为2.但它们不是:S任何人都可以提供帮助吗?非常感激
谢谢,丹
pio*_*trm 24
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
那真的应该可以解决问题。