Выбор 2 отсчетов в 1 запросе - PullRequest
1 голос
/ 17 сентября 2009

Попытка получить два разных числа в одном запросе. Для этого я выбираю из таблицы и мне нужно присоединиться к другой. Проверьте (не работает) запросы ниже. Это были разные способы, которыми я пытался это сделать - безуспешно.

Возможно ли это, и если да, можете ли вы предложить помощь в получении рабочего запроса?

SELECT 
    count( tasks_assigned.task_id ) AS task_assigned_count,
    count( tasks_created.task_id ) AS task_created_count,
FROM projects
LEFT JOIN tasks AS tasks_assigned 
    ON tasks_assigned.project_id = projects.project_id
    AND tasks_assigned.assigned_user_id = 1
LEFT JOIN tasks AS tasks_created 
    ON tasks_created.project_id = projects.project_id
    AND tasks_created.created_user_id = 1
GROUP BY tasks_assigned.project_id, tasks_created.project_id


SELECT 
    projects.*
    , (SELECT count(task_id) as task_assigned_count FROM tasks as task_assigned WHERE task_assigned.project_id = projects.project_id AND assigned_user_id = 1 GROUP BY task_id) as task_assigned_count
    , (SELECT count(task_id) as task_created_count FROM tasks as task_created WHERE task_created.project_id = projects.project_id AND assigned_user_id = 1 GROUP BY task_id) as task_assigned_count
FROM projects

Ответы [ 5 ]

4 голосов
/ 17 сентября 2009
SELECT 
projects.*
, (SELECT count(*) FROM tasks WHERE project_id = projects.project_id AND assigned_user_id = 1) as task_assigned_count,
, (SELECT count(*) FROM tasks WHERE project_id = projects.project_id AND created_user_id = 1) as task_created_count
FROM projects
0 голосов
/ 17 сентября 2009

Я бы сделал это в двух запросах:

SELECT p.project_id, COUNT( a.task_id ) AS task_assigned_count
FROM projects p
LEFT JOIN tasks AS a ON a.project_id = p.project_id
  AND a.assigned_user_id = 1
GROUP BY p.project_id;

SELECT p.project_id, COUNT( c.task_id ) AS task_created_count
FROM projects p
LEFT JOIN tasks AS c ON c.project_id = p.project_id
  AND a.created_user_id = 1
GROUP BY p.project_id;

В противном случае вы создали декартово произведение между двумя экземплярами tasks. Вы также можете использовать DISTINCT, но это только компенсирует декартово произведение, а не избегает его:

SELECT p.project_id, COUNT( DISTINCT a.task_id ) AS task_assigned_count,
    COUNT( DISTINCT c.task_id ) AS task_created_count
FROM projects p
LEFT JOIN tasks AS a ON a.project_id = p.project_id
  AND a.assigned_user_id = 1
LEFT JOIN tasks AS c ON c.project_id = p.project_id
  AND a.created_user_id = 1
GROUP BY p.project_id;
0 голосов
/ 17 сентября 2009

Не 100%, если это то, что вы пытаетесь сделать, но похоже, что вы должны группировать по идентификатору проекта. Вы могли бы сделать:

SELECT projects.project_id, assigned_count.count, created_count.count
FROM projects
LEFT JOIN (SELECT project_id,
                  count(*) AS count,
           FROM projects
           INNER JOIN tasks A 
                  ON tasks.project_id = projects.project_id
           WHERE tasks.assigned_user_id = 1
           GROUP BY projects.project_id) assigned_count
 ON assigned_count.project_id = projects.project_id
LEFT JOIN (SELECT project_id,
                  count(*) AS count,
           FROM projects
           INNER JOIN tasks A 
                  ON tasks.project_id = projects.project_id
           WHERE tasks.created_user_id = 1
           GROUP BY projects.project_id) created_count
 ON created_count.project_id = projects.project_id

или

SELECT  projects.*,
        SUM( IF(tasks.assigned_user_id = 1,       1,0) ) AS task_assigned_count,
        SUM( IF(tasks_created.created_user_id = 1,1,0) ) AS task_created_count
FROM projects
LEFT JOIN tasks A 
        ON tasks.project_id = projects.project_id
GROUP BY projects.project_id
0 голосов
/ 17 сентября 2009

Избавиться от группировки в подзапросах:

SELECT 
      projects.*,
     (SELECT count(task_id) FROM tasks
      WHERE task_assigned.project_id = projects.project_id
      AND assigned_user_id = 1) as task_assigned_count,
...
FROM projects
0 голосов
/ 17 сентября 2009
SELECT (SELECT COUNT(task_id) FROM tasks_assigned) AS task_assigned_count, (SELECT COUNT(task_id) FROM tasks_created) AS task_created_count
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...