[英]complicated sql query returns a result with empty tables
我有三个空桌子
--
-- Tabellenstruktur für Tabelle `projects`
--
CREATE TABLE IF NOT EXISTS `projects` (
`id_project` int(11) NOT NULL AUTO_INCREMENT,
`id_plan` int(11) DEFAULT NULL,
`name` varchar(255) NOT NULL,
`description` longtext NOT NULL,
PRIMARY KEY (`id_project`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `project_plans`
--
CREATE TABLE IF NOT EXISTS `project_plans` (
`id_plan` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`description` longtext NOT NULL,
`max_projects` int(11) DEFAULT NULL,
`max_member` int(11) DEFAULT NULL,
`max_filestorage` bigint(20) NOT NULL DEFAULT '3221225472' COMMENT '3GB Speicherplatz',
PRIMARY KEY (`id_plan`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
-- --------------------------------------------------------
--
-- Tabellenstruktur für Tabelle `project_users`
--
CREATE TABLE IF NOT EXISTS `project_users` (
`id_user` int(11) NOT NULL,
`id_project` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
所有这些表都是空的,但是查询得到结果吗? 我的查询:
SELECT
A.id_plan,
A.name AS plan_name,
A.description AS plan_description,
A.max_projects,
A.max_member,
A.max_filestorage,
B.id_plan,
B.name AS project_name,
B.description AS project_description,
C.id_user,
C.id_project,
COUNT(*) AS max_project_member
FROM
".$this->config_vars["projects_plans_table"]." AS A
LEFT JOIN
".$this->config_vars["projects_table"]." AS B
ON
B.id_plan = A.id_plan
LEFT JOIN
".$this->config_vars["projects_user_table"]." AS C
ON
C.id_project = B.id_project
WHERE
C.id_project = '".$id."'
&& B.deleted = '0'
我认为问题是COUNT(*)AS ...
我该如何解决这个问题?
首先,由于COUNT(),您将明确获得一条记录。 即使您没有记录,您仍在询问引擎有多少记录在最坏的情况下将返回零。 像其他聚合一样,Count()也会有一个分组依据,因此即使您没有分组,您仍然会问。
所以引擎基本上是在说嘿……没有记录,但是我必须向您发送一条记录,以便您可以获取count()列来进行查看并进行处理。 因此,它正在执行您所要求的。
现在,对于您在哪里提出的另一个问题的评论...
是的,但是我想从项目中计算项目成员,如何从所有用户都具有id_project 1的project_users中计算用户。
由于您只关心计数,而不关心所涉及的特定WHO,因此您可以直接从project_users表(在ID_User和ID_Project上都有索引)获得此结果。
select count(*)
from project_users
where id_project = 1
为了从您原始问题的基础上扩展以获取更多详细信息,我将...
select
p.id_project,
p.id_plan,
p.name as projectName,
p.description as projectDescription,
pp.name as planName,
pp.description as planDescription,
pp.max_projects,
pp.max_member,
pp.max_filestorage,
PJCnt.ProjectMemberCount
from
( select id_project,
count(*) as ProjectMemberCount
from
project_users
where
id_project = 1 ) PJCnt
JOIN Projects p
on PJCnt.id_project = p.id_project
JOIN Project_Plans PP
on p.id_plan = pp.id_plan
现在,基于表的这种布局,计划可以具有最大成员数,但是没有任何东西可以指示基于所有项目的计划的最大成员数,或者每个SINGLE项目的最大成员数。 那么,如果一个计划允许20个人,那么在同一计划下10个不同的项目可以有20个人吗? 那只是您会知道的影响……只是考虑您所要的东西。
您清理后的查询应类似于:
也请参见sqlfidle演示: http ://sqlfiddle.com/#!2/e693f5/9
SELECT
A.id_plan,
A.name AS plan_name,
A.description AS plan_description,
A.max_projects,
A.max_member,
A.max_filestorage,
B.id_plan,
B.name AS project_name,
B.description AS project_description,
C.id_user,
C.id_project,
COUNT(*) AS max_project_member
FROM
project_plans AS A
LEFT JOIN
projects AS B
ON
B.id_plan = A.id_plan
LEFT JOIN
project_users AS C
ON
C.id_project = B.id_project
WHERE
C.id_project = '".$id."';
这将为选择的所有cols
返回null
值,因为从结果集中有一个合法的返回值,即count(*)
输出0
。
要解决此问题,只需在末尾添加一个group by
(请参阅示例组http://sqlfiddle.com/#!2/14d46/2 )或删除count(*)
,则null值以及count(*)值0
在此处查看简单的SQL示例: http : //sqlfiddle.com/#!2/ab7dd/5
只需注释count()即可解决null问题!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.