SQL Multiple COUNT() из двух таблиц, внутри левого соединения
У меня есть три таблицы, я хочу выбрать все данные из одной таблицы, а также собрать подсчет, сколько раз эта конкретная строка данных связана в двух других таблицах.
Итак, выберите все данные из site_projects. Затем верните число site_project_members, где site_projects.id = site_project_members.pid, а также возвращает количество site_project_tasks, где site_projects.id = site_project_members.pid
Я надеюсь, что это имеет смысл, чтобы запрос выглядел правильным. и он запрашивает базу данных (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. однако они не являются: Кто-нибудь в состоянии помочь?
Весьма Признателен
Спасибо,
Дан
2 ответов:
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
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Это должно действительно сделать трюк.
Comments