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

Where clause with sum aggregate in sql query

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

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

HAVING SUM(NumberOfUsers) >=0 根本不起作用。我想检查 NumberOfUsers 是否大于 1 然后显示它,如果不大于 1 则不显示它。有什么建议吗?

试试这个:

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)

这样,您就不会在主查询中使用 SUM(您必须使用 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

我认为您可以简化查询,因为您正在检查用户 table 中的条件 is_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 

注意:假设用户 table 有主键作为 id,如果没有,那么您可以在计数函数中使用任何其他列。