mysql - 复杂的sql查询返回结果为空表

标签 mysql sql database

我有三张空 table

--
-- 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() 列来查看并执行您想要的操作。所以,它正在按照您的要求进行操作。

现在,对于您提出的其他问题的评论...

是的,但我想计算项目中的项目成员,我如何计算project_users中的用户,其中所有用户都有id_project 1。

由于您只关心计数,而不关心涉及的具体 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

现在,根据此表布局,计划可以具有最大成员数,但没有任何内容指示基于所有项目的计划的最大成员数或每个单个项目的最大成员数。那么,如果一个计划允许20人,那么同一个计划下的10个不同项目可以有20人吗?只有您才能知道其影响...只是需要考虑您的要求。

关于mysql - 复杂的sql查询返回结果为空表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22514585/

相关文章:

java - 使用 MySQL 在 Hibernate Java 中获取两个日期之间的数据?

mysql - SQL 到谷歌地图点

MySql 如何从 mediumtext 中查询子字符串?

MySQL:在任何子查询中

java - Oracle 查询到 Hibernate 查询的转换

mysql - 当字符串包含空格时应用程序不更新数据库

database - 如何使用较旧的日期字段删除 SQL 中的重复行

mysql - Jira:连接数据库时出错

mysql - 如何使用具有匹配列对的行数更新列?

database - NoSql/Raven DB 实现最佳实践