Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql sql查询中带总和聚合的Where子句_Mysql_Aggregate Functions_Mysql Workbench - Fatal编程技术网

Mysql sql查询中带总和聚合的Where子句

Mysql sql查询中带总和聚合的Where子句,mysql,aggregate-functions,mysql-workbench,Mysql,Aggregate Functions,Mysql Workbench,我有一个表,我只想显示那些至少有一个注册用户的部门。我的问题如下: SELECT departments.id as DepartmentID, departments.depName as DepartmentName, SUM(IF(users.isDelete=0, 1, 0)) AS NumberOfUsers FROM (myDB.departments) LEFT JOIN myDB.users ON departmentID=departments.

我有一个表,我只想显示那些至少有一个注册用户的部门。我的问题如下:

SELECT departments.id as DepartmentID, 
       departments.depName as DepartmentName,
       SUM(IF(users.isDelete=0, 1, 0)) AS NumberOfUsers
FROM (myDB.departments) 
LEFT JOIN myDB.users ON departmentID=departments.id
AND `departments`.`isDelete` =  0
HAVING SUM(NumberOfUsers) >=0
SUM(NumberOfUsers)>=0的
根本不起作用。我想检查
NumberOfUsers
是否超过一个,然后显示它。如果不超过一个,则不显示它。有什么建议吗?

试试这个:

SELECT departments.id as DepartmentID, 
       departments.depName as DepartmentName,
       (SELECT COUNT(u.id)
       FROM users u
       WHERE u.departmentID = d.id) as NumberOfUsers
FROM departments d
WHERE d.isdelete = 0
AND EXISTS
  (SELECT 'user'
  FROM users u
  WHERE u.departmentID = d.id)
这样,您就不会在主查询中使用求和(在主查询中,您必须使用GROUP BY来显示其他标量字段,如departments.id和departments.depName。在我的Sql中,GROUP BY不是必需的)


EXISTS子句保证存在至少一个用户。如果要显示所有部门(独立的用户数,删除EXISTS子句)

在这种情况下,还需要使用
group by
子句

 SELECT departments.id as DepartmentID, 
        departments.depName as DepartmentName,
        SUM(IF(users.isDelete=0, 1, 0)) AS NumberOfUsers
 FROM (myDB.departments) 
 LEFT JOIN myDB.users ON departmentID=departments.id
     AND `departments`.`isDelete` =  0
 GROUP BY departments.id, departments.depName
 HAVING SUM(IF(users.isDelete=0, 1, 0)) >=0
但是如果您想要一个简短的答案,您可以使用
JOIN
而不是
LEFT JOIN
并删除
HAVING
子句:

 SELECT departments.id as DepartmentID, 
        departments.depName as DepartmentName,
        SUM(IF(users.isDelete=0, 1, 0)) AS NumberOfUsers
 FROM (myDB.departments) 
 JOIN myDB.users ON departmentID=departments.id
     AND `departments`.`isDelete` =  0
 GROUP BY departments.id, departments.depName

我认为您可以简化查询,因为您正在检查用户表中的条件,即_delete应该为0,所以不需要左连接,您可以使用普通连接。在此之后,您将通过having子句删除所有没有记录的行,所以您只需将此条件放入where子句中,如下所示-

SELECT dpt.id AS DepartmentID, dpt.depName AS DepartmentName, 
COUNT(usr.id) AS NumberOfUsers
FROM myDB.departments AS dpt 
JOIN myDB.users AS usr ON usr.departmentID=dpt.id
WHERE dpt.`isDelete` =  0 AND usr.isDelete=0 

注意:假设users表的主键是id,如果不是,那么您可以使用count函数中的任何其他列。

不止一个是SUM(NumberOfUsers)>=1
亲爱的,是Sql Server还是我的Sql?您的have运行得很好,而不是根本没有。你只是写错了。您希望>0,而不是>=0。此外,用户数已经相加,因此只需使用NumberOfUsers>0即可。还有分组。还可以进行内部联接并使用where users.numberofusers>0。为什么有sum??我认为您需要计算用户数??在这种情况下,您还需要使用
groupby
子句:这里是否需要求和??可以将count和where子句一起用于isdelete???@VishalJAIN,这也应该可以,但我试图尽可能多地保留原始代码。我注意到它只返回了一行@哪一个?如果执行查询时没有分组方式,是否有多行?请对此进行upvote。这看起来很复杂,但我觉得很有趣。