Как объединить эти два запроса в один? (несколько объединений против одной таблицы) - PullRequest
2 голосов
/ 06 января 2009

Учитывая две таблицы, одна для рабочих и одна для задач, выполненных работниками,

CREATE TABLE IF NOT EXISTS `workers` (
  `id` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
);

INSERT INTO `workers` (`id`) VALUES
(1);


CREATE TABLE IF NOT EXISTS `tasks` (
  `id` int(11) NOT NULL,
  `worker_id` int(11) NOT NULL,
  `status` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
);

INSERT INTO `tasks` (`id`, `worker_id`, `status`) VALUES
(1, 1, 1),
(2, 1, 1),
(3, 1, 2),
(4, 1, 2),
(5, 1, 2);

Я пытаюсь получить количество заданий, которое каждый работник выполняет с каждым кодом состояния.

Я могу сказать либо

SELECT w.*
,COUNT(t1.worker_id) as status_1_count
FROM workers w
LEFT JOIN tasks t1 ON w.id = t1.worker_id AND t1.status = 1 
WHERE 1 
GROUP BY 
t1.worker_id
ORDER BY w.id

или

SELECT w.*
,COUNT(t2.worker_id) as status_2_count
FROM workers w
LEFT JOIN tasks t2 ON w.id = t2.worker_id AND t2.status = 2
WHERE 1 
GROUP BY 
t2.worker_id
ORDER BY w.id

и получить количество задач с одним заданным кодом состояния, но когда я пытаюсь получить значения для нескольких статусов задач в одном запросе, это не работает!

SELECT w.*
,COUNT(t1.worker_id) as status_1_count
,COUNT(t2.worker_id) as status_2_count
FROM workers w
LEFT JOIN tasks t1 ON w.id = t1.worker_id AND t1.status = 1 
LEFT JOIN tasks t2 ON w.id = t2.worker_id AND t2.status = 2
WHERE 1 
GROUP BY t1.worker_id
,t2.worker_id
ORDER BY w.id

Таблица задач перекрестно соединяется с собой, хотя я бы предпочел, чтобы этого не было!

Есть ли способ объединить эти два запроса в один, чтобы мы могли получить значения для нескольких состояний задач в одном запросе?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 06 января 2009
SELECT w.*,
  SUM(t1.status = 1) AS status_1_count,
  SUM(t1.status = 2) AS status_2_count
FROM workers w
  LEFT JOIN tasks t1 ON w.id = t1.worker_id AND t1.status IN (1, 2) 
GROUP BY w.id
ORDER BY w.id;
2 голосов
/ 06 января 2009

Я пытаюсь получить количество задач, которые есть у каждого работника с каждым кодом состояния.

SELECT worker_id, status, COUNT(*)
    FROM tasks
    GROUP BY worker_id, status;

Вот и все.

0 голосов
/ 06 января 2009

У меня здесь нет экземпляра MySQL, но я протестировал его на t-sql box, и он работал.

select distinct(worker_id), 
       (select count(*) from tasks where status = 1) as Status1, 
       (select count(*) from tasks where status = 2) as Status2 
   from tasks;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...