Mysql 将select中的列名替换为subselect
在我的mysql数据库中,我有两个表,project和sub_project。 子项目包含id和首字母缩略词;子项目有一个project_id,它告诉我们它属于哪个主项目。数据库如下所示:Mysql 将select中的列名替换为subselect,mysql,Mysql,在我的mysql数据库中,我有两个表,project和sub_project。 子项目包含id和首字母缩略词;子项目有一个project_id,它告诉我们它属于哪个主项目。数据库如下所示: mysql> SELECT id, acronym FROM project; +----+---------+ | id | acronym | +----+---------+ | 14 | P1 | | 15 | P2 | | 16 | P3 | +----+----
mysql> SELECT id, acronym FROM project;
+----+---------+
| id | acronym |
+----+---------+
| 14 | P1 |
| 15 | P2 |
| 16 | P3 |
+----+---------+
3 rows in set (0.00 sec)
mysql> SELECT id, project_id FROM subproject;
+----+------------+
| id | project_id |
+----+------------+
| 1 | 14 |
| 2 | 14 |
+----+------------+
2 rows in set (0.00 sec)
我想做一个查询,显示每个项目的id和首字母缩写,以及子项目的数量,如下所示:
SELECT id, acronym, COUNT(select * FROM sub_project WHERE project_id=id) AS 'sub_proj_count'
FROM project;
+----+---------+----------------+
| id | acronym | sub_proj_count |
+----+---------+----------------+
| 14 | P1 | 2 |
| 15 | P2 | 0 |
| 16 | P3 | 0 |
+----+---------+----------------+
然而,这在语法上是不正确的。这应该如何表述?模式:
create table project
( id int not null,
acronym varchar(100) not null
);
insert project values
(14,'P1'),
(15,'P2'),
(16,'P3');
create table subproject
( id int not null,
project_id int not null
);
insert subproject values
(1,14),
(2,14);
具有子项目的项目:
select p.id,p.acronym,count(s.id) as theCount
from project p
join subproject s
on s.project_id=p.id
group by p.id,p.acronym;
+----+---------+----------+
| id | acronym | theCount |
+----+---------+----------+
| 14 | P1 | 2 |
+----+---------+----------+
所有项目,即使没有子项目:
select p.id,p.acronym,count(s.id) as theCount
from project p
left join subproject s
on s.project_id=p.id
group by p.id,p.acronym;
+----+---------+----------+
| id | acronym | theCount |
+----+---------+----------+
| 14 | P1 | 2 |
| 15 | P2 | 0 |
| 16 | P3 | 0 |
+----+---------+----------+
您可以进行连接并避免缓慢的子查询。但是你的结果是对的,对吗?问题不在于它太慢,而是它给了我一个语法错误,无法工作。也就是说,select语句的打印输出是我想要实现的,而不是我得到的。我会很高兴有一个修复程序能让它基本上按规定工作,即使速度很慢。使用count和group-by进行连接我尝试了使用SELECT project.id,project.acronym,COUNTsubproject.id从项目内部连接project ON project.id=subproject.project\u id;但这只给了我有子项目的项目。我想计算所有项目的计数,即使是那些子项目为零的项目。选择id,缩写,选择count*FROM sub_project,其中project_id=project.id作为“sub_proj_count”FROM project;应该修复您的查询。但我会使用左连接。