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,如果没有,那么您可以在计数函数中使用任何其他列。
我有一个 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,如果没有,那么您可以在计数函数中使用任何其他列。