mysql - 如何将这两个查询合并为一个? (针对同一个表的多个联接)

标签 mysql

给定两张表,一张用于 worker ,一张用于 worker 完成的任务,

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

任务表正在与自身交叉连接,而我宁愿它不交叉连接!

有没有办法将这两个查询合并为一个,以便我们可以在单个查询中检索多个任务状态的计数?

谢谢!

最佳答案

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;

关于mysql - 如何将这两个查询合并为一个? (针对同一个表的多个联接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/415571/

相关文章:

mysql - 将 Wordpress 站点移动到 Docker : Error establishing DB connection

mysql - LEFT JOIN 无法替换 NOT EXISTS MYSQL

PHP $db PDO 连接错误

mysql - IN 子查询中的 GROUP_CONCAT

php - 如何修复插入数据到第二个表

mysql - 从 VBA 调用 mySQL 存储过程 (Excel 2013)

c# - 列 'month' 不能为空

php - 与 zend Framework 2 相关的数据库表

javascript - 无法获取node.js路由中的mysql计数

mysql - ER 图 - 与两个不同实体的相同关系