繁体   English   中英

复杂的sql查询返回带有空表的结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM