gpt4 book ai didi

mysql - 使用连接表中的两个计数编写 JOIN 查询

转载 作者:可可西里 更新时间:2023-11-01 08:06:34 25 4
gpt4 key购买 nike

我已经花了几个小时来解决这个问题,但我无法让计数正常工作。希望有人能帮忙?!

我有一个项目表和任务表,链接在 project_id 上。我可以通过以下查询获取 project_id、project_name 和 status_id:

SELECT 
a.project_id,
a.project_name,
b.status_id
FROM project_list as a
INNER JOIN task_list as b
ON a.project_id=b.project_id

我想为每个项目选择一条记录,并根据 status_id 添加两个计数字段。在伪代码中:

SELECT 
a.project_id,
a.project_name,
(SELECT COUNT(*) FROM task_list WHERE status_id < 3) as not_completed,
(SELECT COUNT(*) FROM task_list WHERE status_id = 3) as completed
FROM project_list as a
INNER JOIN task_list as b
ON a.project_id=b.project_id
GROUP BY project_id

我的建表脚本如下:

CREATE TABLE `project_list` (
`project_id` int(11) NOT NULL AUTO_INCREMENT,
`topic_id` int(11) DEFAULT NULL,
`project_name` varchar(45) DEFAULT NULL,
PRIMARY KEY (`project_id`)
)

CREATE TABLE `task_list` (
`task_id` int(11) NOT NULL AUTO_INCREMENT,
`project_id` int(11) DEFAULT NULL,
`task_name` varchar(45) DEFAULT NULL,
`status_id` int(11) DEFAULT '0',
PRIMARY KEY (`task_id`)
)

非常感谢任何帮助。谢谢!

编辑:回答:

SELECT 
a.project_id,
project_name,
SUM(status_id != 3) AS not_completed,
SUM(status_id = 3) AS completed,
SUM(status_id IS NOT NULL) as total
FROM tasks.project_list as a
INNER JOIN tasks.task_list as b
ON a.project_id=b.project_id
GROUP BY a.project_id

最佳答案

问题在于,在您的子查询中,您计算​​的是整个表中的所有行,而不仅仅是具有正确 project_id 的行。您可以通过修改每个子查询中的 WHERE 子句来解决此问题。

(SELECT COUNT(*)
FROM task_list AS c
WHERE c.status_id < 3
AND a.project_id = c.project_id)

然而,更简单的方法是使用 SUM 和 bool 条件而不是 COUNT 来计算符合条件的行数:

SELECT 
a.project_id,
a.project_name,
SUM(b.status_id < 3) AS not_completed,
SUM(b.status_id = 3) AS completed,
FROM project_list as a
INNER JOIN task_list as b
ON a.project_id = b.project_id
GROUP BY project_id

这是有效的,因为 TRUE 的计算结果为 1FALSE 的计算结果为 0

关于mysql - 使用连接表中的两个计数编写 JOIN 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13544192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com